Laravel :: Tratando exceções (Exceptions)

Desde que fui para a 99 comecei a desenvolver com novas linguagens de programação. Estando lá, trabalhei com o time de desenvolvimento utilizando Java, Python como time de data e o R com o time de insights.

Mas a linguagem que me fez começar, lá em 2001, foi o PHP. Muitos dizem que é uma linguagem ruim, mas sempre defendi um outro ponto. Linguagens de desenvolvimento não são ruins por si só, mas o que faz algo ser bom, ou ruim, são os desenvolvedores.

PHP por ser uma linguagem com hospedagens gratuitas (ou bem baratas), com uma grande comunidade e com diversos softwares open-source (como wordpress), fez com que muita gente começasse a programar, assim como eu. O “problema” disso é que existe muita gente no nível muito básico que acredita ser um bom programador (não que eu ache que eu seja perfeito, ainda tenho mutio que melhorar e aprender).

Para auxiliar no deseneolvimento, as frameworks foram criadas. Desde 2014 estou utilizando o Laravel. Simples, fácil e rápido de aprender, bem documentado, bem estrutado. O Laravel foi a forma que encontrei, em projetos PHP, de acelear o processo de desenvolvimento.

Ainda estudo muito sobre a framework e as vezes acho que existem alguns pontos que a documentação (ou sua aplicação) é bastante complexa. Decidi então compartilhar aqui os meus aprendizados. Vejam isso mais como uma forma de documentar para mim mesmo caso em algum momento não lembre como aplicar 🤣, como também um ponto de vista de como utilizar.

O que são exceções?

Em geral, uma exceção é quando, durante o processamento de uma ação dentro do código, foge do esperado e requer um processamento especial. Dentro do PHP é possível usar o conceito de try… catch… finally.

<?php
try {
  // code here
}
catch (Exception $e) {
  // code for expcetion
}
finally {
  // code to run either if successfull or failure
}

Por que utilizar exceções customizadas?

Ok, mas por que não utilizar a exception padrão da linguagem? Os motivos são bastante simples:

  • Fácil entendimento do erro: uma exceção deve mostrar de forma rápida e simples o motivo e origem do problema;
  • Adicionar informações relevantes: a fim de facilitar o debug, principalmente por outros desenvolvedores, no momento de realizar a correção;
  • Exceções genéricas não apontam o caminho a ser seguido: no momento do tratamento de uma exceção, trabalhar com exceções genéricas requerem a interpretação de um programador. Utilizando uma exceção não genérica, muitos dos problemas (inclusive mensagens de erro para o usuário final) podem se manipulados de forma mais eficiente.

Criando exceções no Laravel

Como tudo no Laravel, o artisan está aí para isso! O código abaixo ira gerar uma nova exceção dentro da pasta app/exceptions do seu projeto:

$ php artisan make:exception MyNewException
<?php

namespace App\Exceptions;

use Exception;

class MyNewExcpetion extends Exception
{

}

Por boas práticas, mantemos sempre o Exception no final do nome de nossa exceção. Isso facilitará para futuros desenvolvedores entenderem que o que ele está recebendo é de fato uma exceção.

O código gerado anteriormente, por si só, já estaria completo e poderiamos utilizar nossa exception e teriamos, caso o debug esteja ativado, o seguinte retorno:

App \ Exceptions \ MyNewException
My error message

Customizando minha exceção

Como todas as exceções são tratadadas, quando não tratadas, pela classe App\Exceptions\Handler do Laravel, podemos ir além! A classe utiliza duas ótimas funções para que o programador possa customizar ainda mais o comportamente da exceção:

  • report: permite customizar o envio da exceção para um gerenciador de erros (como Sentry, Bugsnag, etc);
  • render: exibe a exceção como uma resposta HTTP (ótimo para exceções que precisam ser mostradas de forma amigável para o usuário).

Podemos aplicar da seguinte forma dentro de nossa exceção criada anteriormente:

<?php

namespace App\Exceptions;

use Exception;

class MyNewExcpetion extends Exception
{
    /**
     * Report the exception.
     *
     * @return void
     */
    public function report()
    {
        //
    }

    /**
     * Render the exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request
     * @return \Illuminate\Http\Response
     */
    public function render($request)
    {
        return response(...);
    }
}

Veja também que é possível chegar no mesmo objetivo de forma genérica direto dentro da classe App\Exceptions\Handler alterando as funções ali presentes.

Ainda dentro do Handler do Laravel é possível customizar dois pontos:

  • Exceções que não devem ser reportadas: basta adicionar as classes dentro da variavel $dontReport;
  • Inputs que não devem persistir com o flash: que precisam ser adicionadas na variável $dontFlash.

Reportando uma exceção e continuando a execução

Em alguns casos, ao receber uma exceção, desejamos seguir algum outro caminho. Porém, pode ser interessante fazer o log dessa exceção para futura análise, sem prejudicar o funcionamento da plataforma.

Para isso, a framework disponibiliza um helper: report($exception)

Basta enviar a exceção para a função que ela executará o report da classe Handler.

Exceções HTTP

Para finalizar, o Laravel já vem com algumas páginas de erro HTTP padrão. Erros como 404 (páginas não encontrada) e 500 (erro interno do servidor) são apresentados para o usuário como uma página HTML:

Página 404 do Laravel 5.7

Para customizar as páginas de erro, basta criar dentro de 
resources/views/errors/ as páginas blade. Lembre-se que as páginas devem ser nomeadas de acordo com o status HTTP que deseja exibir. Ou seja, para uma página de erro 404, o arquivo deverá ser nomeado 404.blade.php.

Caso queira apenas dar uma mudada no padrão do Laravel, a framework permite publicar as páginas pré-existentes com o seguinte comando:

php artisan vendor:publish --tag=laravel-errors

As views serão adicionadas ao caminho das páginas de erro.

Abraços,
Gui Mori

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

My New Stories