;

quinta-feira, 13 de janeiro de 2011

Usando Try-Cath-Finally para o tratamento de exceções

Neste artigo irei abordar o tratamamento de exceções com o bloco try-catch-finally. Explicarei o que é um try catch, como é implementado, para que serve e quando deve ser utilizado.

 

O que é e para que serve um bloco Try Catch

O bloco Try-Catch é utilizado para o tratamento de exceções, ou seja, erros que ocorrem em tempo de execução e podem derrubar a aplicação. Com o bloco “try” “captura” e pode identificar o erro, e tratá-lo da maneira que achar mais conveniente no bloco “catch”.

Um Try-Catch possui a seguinte estrutura:

try
{
    //Código executado se não ocorrer nenhum erro.
}
catch
{
    //Código executado se ocorrer um erro no bloco try - aqui você trata o erro.
}
finally
{
    //Bloco de código opcional. O código neste bloco sempre é executado.
}

Como podemos ver no bloco de código acima, a aplicação executa primeiro o código que está após o “try”. Se não ocorrer nenhum erro, executa este bloco, ignora o código que está após o “catch” e executa o código que está após o “finally”, se este bloco existir.  Caso ocorra algum erro, em alguma linha do bloco “try”, a execução é interrompida e a aplicação executa o código que está após o “catch”. Despois executa o código do bloco “finally” normalmente.

Porém, vale lembrar que, se ocorrer uma exceção dentro dos blocos “Catch” ou “Finally”, a aplicação é derrubada, a não ser que exista um bloco Try-Catch aninhado neste bloco, o que é perfeitamente aceitável. Veja um exemplo simples de um bloco Try-Catch:

try
{
    int numero1 = 4;
    int numero2 = 12;
    int soma = numero1 + numero2;

    Console.WriteLine(soma);
}
catch (Exception ex)
{
    Console.WriteLine("Ocorreu o seguinte erro");
    Console.WriteLine(ex.Message);
}
finally
{
    Console.WriteLine("Pressione Enter para sair");
    Console.ReadLine();
}

No exemplo acima, caso não ocorra nenhum erro em tempo de execução, o programa irá somar as duas variáveis , escrever o resultado na tela e imprimir a mensagem “Pressione Enter para sair”, terminando a execução ao pressionar Enter. Se ocorrer uma exceção no bloco “try”, o programa para de executar nesta linha e salta para o bloco “catch” e exibe o alerta de erro e imprime na tela o erro ocorrido (ex.Message retorna o erro ocorrido). E por fim executa o bloco “finally”.

 

Quando usar Try-Catch

Antes de qualquer coisa, o bloco Try-Catch pode e deve ser utilizado sempre que temos uma situação que não se pode garantir que não ocorra alguma exceção. Por exemplo, uma conexão de banco de dados ou um acesso à rede mal sucedido, um arquivo não encontrado, um caractere inválido digitado pelo usuário, overflow, entre tantas outras situações que podem causar um erro de execução. Para qualquer situação de exceção, utiliza-se um bloco try-catch. 

Porém, em situações que você sabe que a chance de dar erro é muito grande, utilize o que muitos chamam de programação defensiva. Ou seja, antes de executar um comando, certifique-se de que este comando não irá dar erro, utilizando uma estrutura de decisão (if-else). Por exemplo, numa divisão de números informados pelo usuário, certifique-se que não está fazendo uma divisão por zero ou, antes de abrir um arquivo, faça um “if” para saber se o arquivo realmente existe.

Na minha opinião, o ideal é combinar a programação defensiva com tratamento de exceções, utilizando if-else nas situações mais comuns, deixando o try-catch para os casos mais genéricos e difíceis de capturar com if-else.

Particularmente, eu prefiro utilizar o tratamento de exceção na camada de interface. E sempre dentro das funções de tratamento de eventos – Load de uma página, ou form, clique de um botão, ou qualquer outro evento. Isto permite que se capture e trate os erros de qualquer camada na interface, de forma a garantir que nenhum código será executado se ocorrer um erro, e sem derrubar minha aplicação.

 

O bloco Finally

Como disse anteriormente, o bloco finally é opcional, e sempre é executado, se existir, é claro. Geralmente é utilizado para liberar recursos alocados no bloco try. Só lembrando, ao contrário do bloco de catch, só pode existir um finally para cada bloco try.

Para saber mais sobre o try-catch-finally, confira a documentação do MSDN.

0 comentários:

Postar um comentário