Criar uma Exception personalizada no Magento 2
Tags: php, magento2, tutorial, braziliandevs
Published: 2021-12-13 13:26:22



## 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](https://www.php.net/manual/pt_BR/language.exceptions.php).

---

## 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
<?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 exceção estão disponíveis no caminho `\Magento\Framework\Exception`.

### Disparando uma exceção

Ao disparar uma exceçã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 exceção personalizada no Magento, é igual a lançar qualquer outra exceção.

```php
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.

```bash
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
```