Quando utilizamos “try except” para tratar nossas exceções, encontramo-nos algumas vezes em uma situação onde teremos um tratamento interno da exceção, e depois um tratamento externo, seja da mesmo exceção, seja um tratamento para qualquer exceção que o sistema apresente.
Vamos imaginar, por exemplo, que precisamos tratar uma exceção internamente, mas gostaríamos de gerar o log de qualquer exceção que ocorra na aplicação. Se tratarmos as exceções internas, o tratamento da exceção externa que gera o log jamais será executado. Poderíamos duplicar a exceção e gerar uma nova exceção depois de tratarmos a primeira, mas o Delphi possui um recurso próprio para isso, chamado reraising. Ao invés de criar uma nova exceção, o Delphi irá rechamar a última exceção ocorrida, melhorando inclusive a performance, porque ele não cria novamente a exceção, apenas utiliza aquela que já foi gerada:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
procedure Exemplo; begin try //Faça alguma coisa aqui. try raise ETeste.Create('Mensagem de erro.'); except on ETeste do begin //Tratamento da exceção internamente ShowMessage('ETeste 1'); raise; end; end; except //Tratamento da exceção externamente on ETeste do begin GerarLog('Ocorreu o erro do tipo ETeste!'); end; on EDivByZero do begin GerarLog('Ocorreu o erro do tipo EDivByZero!'); end; on Exception do begin ShowMessage('Ocorreu um erro!'); end; end; end; |
O método GerarLog é meramente figurativo, para simbolizar que um log estará sendo gerado. O importante no código àcima é a chamada de “raise” sem nenhum parâmetro adicional. Quando isso acontece, o compilador entende que deve ser chamada a última exceção gerada anteriormente.
Execute o código acima e depois execute-o sem a chamada de raise, e perceba a diferença. Utilizando o “reraising“, você possui um poder maior no controle do fluxo da sua aplicação.