Olá amigos leitores! Há algum tempo venho estudando detalhadamente o tratamento de exceções usando Try, Except, Finally e após encontrar muita coisa igual na internet, resolvi escrever de forma objetiva o uso dessas cláusulas ainda ignoradas por alguns desenvolvedores. Nesse artigo não entrarei em detalhes históricos, irei direto ao ponto.
Objetivo desse artigo é apresentar:
- Problemas que geram exceções.
- Try, Finally com exemplos.
- Try, Except com exemplos.
- Try, Except com o tipo de exceção especificado.
Repare a figura abaixo:

Figura 1 - Mensagem de Erro
Eu tenho certeza que todos os desenvolvedores em algum momento
da vida já se depararam com a mensagem da figura acima, ou então,
com outras do tipo: “List index out of bounds (-1)”, ou ainda “Cannot
make a visible window modal”. Essas mensagens não são geradas
simplesmente pela sua Aplicação ou pelo Delphi, na verdade, elas
são exceções não tratadas.
Para entender melhor,
exceção é um objeto definido pelo tipo Exception ou
uma classe descedente. Sua função é trabalhar especificamente
nos casos de anormalidade que podem ocorrer na Aplicação, exemplo:
Se tentarmos acessar um índice não existente no ListBox, uma
anormalidade será detectada pela exceção e uma mensagem
será mostrada.
Vejamos esse exemplo da forma prática:

Figura 2 - Tela da Aplicação
Código do Evento OnClick do Botão "Mostrar":

Figura 3 - Código do Botão Mostrar
Com a aplicação em execução a Exceção é mostrada
após o clique no botão "Mostrar":

Figura 4 - Erro gerado ao clicar sobre o botão Mostrar
Análise
No Evento OnClick() do Botão "Mostrar", repare que existem
duas linhas com ShowMessage, mas a segunda linha nem chega a ser executada.
Esse problema ocorreu porque a Aplicação tentou acessar um índice
inexistente e assim, a exceção detectou uma anormalidade na execução
do primeiro ShowMessage e retornou a mensagem "List index out
of bounds(-1)".
No Delphi devemos tratar esse tipo de problema utilizando as cláusulas
Try, Except e Finally.
Try - Except - Finally
A cláusula Try é usada para iniciar um bloco que pode conter
possíveis erros. Se um erro ocorrer, o programa não será terminado.
Instantaneamente, o Try deixa de ser executado e dá lugar a cláusula
Except ou Finally. Try pode ser usado em inúmeros trechos do código,
podendo até ser aninhado.
A cláusula Except é usada para iniciar um bloco caso uma exceção
ocorra em Try. Se o bloco que estiver em Except conter a exceção
o programa não será terminado.
A cláusula Finally é usada para iniciar um bloco havendo problemas
ou não com a cláusula Try.
Versão 1 - Try - Finally
Nos trechos de código Try - Finally, a cláusula Finally garante
que todo o código contido em Finally será executado
independente ou não de problemas no código executado dentro da
cláusula
Try. Em Try - Finally, Finally geralmente é usado
para permitir limpeza
de recursos alocados anteriormente. Exemplo de Implementação
Try
// Trechos de Código
Finally
// Trechos de Código
End;
No exemplo abaixo uma divisão por Zero ocorre sem sucesso em Try exatamente
na linha "numero := 1 div zero;" gerando uma exceção
que não é tratada. Assim, a linha "ShowMessage(
'numero / zero = ' + IntToStr( numero ) );" não é executada e o
código dentro da cláusula finally é executado.

Figura 5 - Exemplo de código Try - Finally
Depois que o trecho de código da cláusula finally é executado
a exceção não tratada retorna a mensagem:

Figura 6 - Mensagem não tratada
Versão 2 - Try - Except
Nos trechos de código Try - Except, somente se a cláusula Try gerar
uma exceção é que a cláusula Except será executada.
Except é usado para realizar ação alternativa
quando algo inesperado ocorrer em Try. A cláusula Except por
si só, não
pode determinar o tipo de erro encontrado. Exemplo de Implementação:
Try
// Trechos de Código
Except
// Trechos de Código
End;
No exemplo abaixo, uma divisão por Zero ocorre sem sucesso em Try,
exatamente na linha "numero := 1 div zero;", gerando
uma exceção
tratada com "ShowMessage('Erro desconhecido encontrado!');".
Assim,
nenhuma mensagem de exceção é mostrada.

Figura 7 - Exemplo de código Try - Except
Resultado da exceção gerada no exemplo acima:

Figura 8 - Mensagem tratada genericamente
No caso do Except podemos utilizar diferentes ações
para diferentes tipos de exceções, tais como EInOutError. Além
disso, a cláusula else pode ser usada para pegar todos
os tipos de exceções
inesperadas, e o tipo geral Exception é usado para pegar todos os tipos
de exceções. Atribuindo um nome à exceção,
o texto da mensagem da exceção (Name.Message) pode ser obtido
para a exibição, ou então, para outras finalidades.
Quando uma exceção aparece como no próximo exemplo, se
a exceção não age sobre sentenças On ou Else, então
uma checagem é feita para ver se estamos num bloco Try aninhado. Caso
sim, a cláusula Except do pai Try é processada. Se não,
uma cláusula On ou Else é procurada, e o programa termina.
A cláusula Else não é realmente necessária
- é melhor
usar On E:Exception Do, que é o tratamento de exceção
genérico,
já que ele fornece a mensagem de erro (E.Message).
Exemplo de Implementação
Try
// Trechos de Código
Except
// E : Exception Do
On Nome : TipoDaExceção Do
// Trechos de Código
Else // opcional
// Trechos de Código
End;
Nota: Você pode determinar o tipo de erro que ocorreu usando a manipulação
de exceção genérica - On E:Exception Do.
'E' é um
ponteiro ao objeto Exception criado pela condição de exceção.
No exemplo abaixo uma divisão por Zero ocorre sem sucesso em Try exatamente
na linha "numero := 1 div zero;" gerando uma exceção
tratada de forma que o tipo de exceção seja mostrada, linha on
E : Exception do ShowMessage(E.ClassName + 'erro gerado, com mensagem: ' +
E.Message');

Figura 9 - Exemplo de código Try - Except com Identificação da Exceção
Resultado da exceção gerada no exemplo acima:

Figura 10 - Exceção Identificada
Antes de encerrarmos a primeira parte, deixo uma dica importantes para
implementação do Try, Except e Finally em
casos de tratamento
de exceções:
Nunca construir tratamento de exceções dessa forma:
Try
...
Except
...
Finally
...
End;
A maneira correta de se aninhar o tratamento de exceções usando Try,
Except, Finally é:
Try
Try
...
Except
...
End;
Finally
...
End;
Encerramos aqui a primeira parte referente ao tratamento de exceções.
No próximo artigo abordarei mais profundamente o assunto e também
apresentarei as listas de exceções
mostrando alguns exemplos. Espero que isso possa ajudar e também espero
que vocês possam contribuir com comentários referente a experiências
obtidas com o uso do tratamento de exceções.
Caso tenham dúvidas, entrem em contato.
João Marcos
Contato: jsakalauska@gmail.com
|