Buscar

Tratamento de exceções - parte 1

nome

João Marcos Sakalauska

Colunista ainda sem descrição. Caro colunista, por favor envie-nos sua descrição.

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, já 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:


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:

Aplicação


Código - Evento OnClick() do Botão "Mostrar".


Com a aplicação em execução a Exceção é mostrada após o clique no 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.

 

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


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.



Resultado da exceção gerada no exemplo acima


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, 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 : Tipo da Exceçã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');



Resultado da exceção gerada no exemplo acima


Antes de encerrarmos a primeira parte deixo alguns pontos importantes para implementação do Try, except e finally em casos de tratamento de exceções.

Pontos Importantes
Nunca construir tratamento de exceções dessa forma:

Try
  ...
Except
  ...
Finally
  ...
End;

Forma correta de Aninhar 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 tópico abordarei mais profundamente o tratamento de exceções e também apresentarei as listas de exceções mostrando alguns exemplos. Espero que isso possa ajudar, também espero que vocês possam contribuir com comentários referente a experiências obtidas com o uso do tratamento de exceções. Dúvidas escrevam para João Marcos - jsakalauska@gmail.com

Publicidade

Vote no artigo




Quantidade de votos: 1 voto
Aceitação: 20%


Detalhes do artigo

Categoria: Object pascal
Adicionado dia: 08/01/07
Por: João Marcos Sakalauska
Visualizado: 153164 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009