- O que são exceções?
- Por que utilizar exceções customizadas?
- Criando exceções no Laravel
- Customizando minha exceção
- Reportando uma exceção e continuando a execução
- Exceções HTTP
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:
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