Blog de Notícias

Exceções no Laravel

Exceções no Laravel

Exceções no Laravel

Como desenvolvedor PHP, talvez use exceções por elas permitirem que você saiba quando algo errado aconteceu ou o quando o usuário agiu de forma não esperada (como tentar dividir números por zero) em sua aplicação. Sem o uso de exceções, sua aplicação acabaria apresentando erros indesejáveis e seria muito mais difícil de depurar. Também é importante pausar a execução e realizar outra ação em caso de exceção.

Exceções são simples de entender e facilitarão o progresso do seu desenvolvimento. Quando aprender a usar exceções, verá que elas serão algo comum no seu desenvolvimento.

O Que É uma Exceção?

Acredito que a melhor definição para exceções foi dita pelo Martin Fowler:

Exceções sinalizam algo fora do comportamento esperado de um dado trecho de código.

Mais precisamente, uma exceção é um evento que acontece durante a execução de um programa, quebrando o fluxo normal das instruções do mesmo. Quando você usa uma exceção (criando um objeto e passando para o sistema em execução) através do throw, o sistema irá capturá-la (através do catch) e buscará o manipulador de exceção adequado para ela e retornará a mensagem correta.

1

2

3

4

5

6

try {

    // the code goes here

} catch (Exception $e) {

    // if an exception happened in the try block above

 

}

Quando Precisamos Usar Exceções?

Use exceções quando se deparar com circunstâncias excepcionais que previnam a execução normal do sistema. Usamos exceções apenas quando o sistema não for capaz de determinar o que aconteceu. Martin Fowler acredita que "se uma falha é um comportamento esperado, não se deve usar exceção para ela". Isso significa que só deve, realmente, usar exceções quando não puder determinar o erro. Exceções deveriam ser usadas apenas em casos raros.

Nota: Exceções não são boas para manipular operações lógicas.

Para um sistema que valida dados de entrada, é errado usar exceções. Primeiro, o campo de texto é algo que conhecemos e, em uma aplicação como essa, devemos reportar um conjunto de erros ao invés de um único erro. Sou dos que acreditam que não se deve usar exceções em casos onde podemos esperar por erros de validação.

Capturar uma exceção é bastante importante, já que, caso isso ocorra, o sistema resultará em um erro. A operação de captura deve ser realizada tão logo quando a exceção ocorra.

 

Advertisement

Exceções no Laravel

O Laravel usa um manipulador de exceções, que é uma classe no arquivo App\Exceptions\Handler.php. Essa classe contém dois métodos principais (o método renderHttpException, que é usado para todas exceções HTTP, como os erros 404 e 503, fica na classe pai do manipulador). O primeiro é o report, que é usado para registrar exceções ou enviá-las para um serviço externo. Eis um exemplo do método report:

1

2

3

4

5

6

7

8

public function report(Exception $e)

{

    if ($e instanceof CustomException) {

        //

    }

 

    return parent::report($e);

}

O segundo é o render. O método render é responsável por converter uma dada exceção em uma resposta HTTP que deve ser enviada de volta para o navegador. Eis um exemplo do método render:

1

2

3

4

5

6

7

8

public function render($request, Exception $e)

{

    if ($e instanceof CustomException) {

        return response()->view('errors.custom', [], 500);

    }

 

    return parent::render($request, $e);

}

Nota: Você pode usar a propriedade $dontReport do manipulador de exceção para ignorar exceções de acordo com seus tipos.

Você pode sobrescrever os métodos de exceção do Laravel, com suas próprias exceções, dessa forma:

1

2

3

4

5

6

7

public function render($request, Exception $e)

{

    if (config('app.debug')) {

        return parent::render($request, $e);

    }

    return $this->handle($request, $e);

}

Isso será renderizado quando o modo de depuração estiver ativado.

Como Criar sua Prórpia Exceção no Laravel?

Talvez você tenha a necessidade de criar sua própria classe de exceção. Você precisará estender a classe base de Exceção do Laravel—criei uma classe abstrata que se comportará como a classe base para nossa classe de Exceção customizada. Crie o arquivo App/Exceptions/MyException.php:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

namespace App\Exceptions;

use Exception;

abstract class monException extends Exception

{

    protected $id;

    protected $details;

     

    public function __construct($message)

    {

        parent::__construct($message);

    }

 

    protected function create(array $args)

    {

        $this->id = array_shift($args);

        $error = $this->errors($this->id);

        $this->details = vsprintf($error['context'], $args);

        return $this->details;

    }

 

    private function errors($id)

    {

        $data= [

            'not_found' => [

                'context'  => 'The requested resource could not be found but may be available again in the future. Subsequent requests by the client are permissible.',

            ]

            //   ...

        ];

        return $data[$id];

    }

}

E sua classe de Exceção:

1

2

3

4

5

6

7

8

9

namespace App\Exceptions;

class NotFoundmonException extends  monException

{

    public function __construct()

    {

        $message = $this->create(func_get_args());

        parent::__construct($message);

    }

}

Você pode usar a classe acima em seu código, assim:

1

2

3

4

5

6

7

try {

    throw new \App\Exceptions\NotFoundmonException('not_found');

}

catch(\App\Exceptions\NotFoundmonException $e)

{

    return $e->getMessage();

}

Além da classe de Exceção padrão do Laravel, você pode usar o pacote Assertion. Ele pode ser usado como uma classe de exceção de externa, de forma a evitar enormes quantidades de blocos if em seu código.

Para instalar o pacote Assertion, você deve executar o seguinte comando:

1

composer require beberlei/assert

Por exemplo, se quiser verificar o endereço de e-mail de um usuário, você pode fazer assim:

1

2

3

4

5

6

7

8

9

use Assert\Assertion;

use Assert\AssertionFailedException;

//...

try {

    Assertion::email($value, "The value must be valid E-mail address");

} catch(AssertionFailedException $e) {

    $e->getValue(); // the value that caused the failure

    $e->getConstraints(); // the additional constraints of the assertion.

}

Conclusão

Independente da linguagem que você usar, é muito importante entendermos exceções, uma vez que elas ajudam a controlar o fluxo de execução de uma aplicação.

Além do mais, elas nos ajudam a registrar problemas quando eles acontecem, além de tornar a aplicação mais robusta.

Como você pode ver pelo que foi realizado nesse tutorial, o Laravel é uma framework que oferece ótimas maneiras de manipular exceções ao se criar aplicações web.