Criar uma Exception personalizada no Magento 2

Contextualizando

O que é uma Exception?

É um mecanismo que sinaliza um evento excepcional, significa algo que não é comum. A exceção ocorre quando acontece algo fora da regra de negócio prevista.
O tratamento de exceção é o mecanismo responsável pelo tratamento da ocorrência de condições que alteram o fluxo normal da execução de programas de computadores.
Exceção são usadas para fazer tratamentos no código, ou seja, podemos fazer um controle de exceção em determinada parte de um código fonte para saber qual foi o erro que levou ao problema.
Uma exceção pode ser lançada através da palavra reservada throw quando o trecho de código estiver envolvido na palavra reservada try, e capturada através da palavra reservada catch. Cada bloco try precisa ter ao menos um catch ou finally correspondente.
Uma classe de exceção definida pelo usuário pode ser criada herdando a classe \Exception, consequentemente, o objeto lançado precisa ser uma instância da classe \Exception ou uma subclasse de \Exception. Tentar lançar um objeto sem essa ascendência resultará em um erro fatal. Para saber mais, consulte a documentação oficial do PHP sobre as exceptions.

Código para criar uma Exception

Este tipo de arquivo deve seguir a estruturas de pastas \{Vendor}\{Module}\Exception\{Name}Exception.php. Cada arquivo de Exception deve estender a classe \Magento\Framework\Exception\LocalizedException.

<?php

namespace {Vendor}\{Module}\Exception;

use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Phrase;

class {Name}Exception extends LocalizedException
{
    public function __construct(
        Phrase $phrase = null,
        \Exception $cause = null,
        array $params = [],
        $code = 0
    ) {
        parent::__construct($phrase, $cause, $params, $code);
    }
}

A classe \Magento\Framework\Exception\LocalizedException estende da classe \Exception do PHP e é estendida por um conjunto de classes que o próprio Magento já disponibiliza para o uso, estas classes de excessão estão disponíveis no caminho \Magento\Framework\Exception.

Disparando uma excessão

Ao disparar uma excessão, o código será interrompido e será "capturado" pelo primeiro catch que envolverá o código (podendo ser de outra função ou método. Para disparar uma excessão personalizada no Magento, é igual a lançar qualquer outra excessão.

throw new \{Vendor}\{Module}\Exception\{Name}Exception(
    __('{Message exception}')
);

Finalização

Valores entre chaves ({test}) devem ser alterados na implementação do código.

Habilitando as alterações

Execute o comando PHP para limpar todos os caches de armazenamento em cache do processos.

php bin/magento cache:clean
php bin/magento flush

Diretórios e Arquivos

Segue a a lista de diretórios e arquivos que devem ser criados.

- app/
  - code/
    - {Vendor}/
      - {Module}/
        - etc/
          - module.xml
        - Exception/
          - {Name}Exception.php
        - registration.php
        - composer.json

17