Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 07 de Junho de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
22 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Artigos]  Try..Except..Finally - Parte 01
Publicado por ActiveDelphi : Sexta, Agosto 24, 2007 - 07:00 GMT-3 (6762 leituras)
Comentários 2 Comentários   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
João Marcos 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



Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.


por: mcherato : Ago 24, 2007 - 08:08
(Informações sobre o membro | Enviar uma mensagem)
Li esse artigo quentinho, saido do forno... muito bom, acho que é uma questão de respeito com o usuário você fazer o tratamento de erros. Não tem coisa mais desagradável que uma tela que você mau consegue entender só com um botão OK, para você clicar e sabendo que vai sair e muitas vezes perder o que estava fazendo!


por: GBarcelos : Ago 24, 2007 - 12:31
(Informações sobre o membro | Enviar uma mensagem) http://
ao tratar o erro pelo try except, tem como saber em qual linha do código fonte que ocorreu o erro ?
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados