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 onE : 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: 152635 vezes