Beruflich Dokumente
Kultur Dokumente
Não importa o quão correto seja o seu código, seus programas sempre
devem estar preparados para tratar erros. Por exemplo, durante um
processamento complexo seu código pode descobrir que não term
permissão para ler um arquivo, ou enquanto ele está enviando uma
requisição por rede, a conexão de rede pode cair.
Classes de exceções
Capturando exceções
• Blocos try que contém código que forma a parte normal das
operações do programa, mas que podem encontrar algumas
condições sérias de erro.
• Blocos catch que contém código que lida com as várias condições
de erro que podem aparecer enquanto o código do bloco try está
sendo processado.
• Blocos finally que contém o código que desaloca recursos ou
executa qualquer outra ação ao final de um bloco try ou de um
bloco catch. É importante entender que o bloco finally será
executado independentemente de uma exceção ter sido lançada.
Uma vez que colocamos código de tarefas de finalização que
julgarmos que sempre deva ser executado no bloco finally, o
bloco finally é opcional.
try
{
//código de execução normal
}
catch
{
//tratamento do erro
}
finally
{
//finalização
}
catch (OverflowException e)
{
...
}
using System;
namespace TryCatchException
{
public class Teste
{
public static void Main()
{
string userInput;
bool digitou = true;
while (digitou)
{
try
{
Console.Write(“Insira um número entre 0 e 5
“ +
“(ou pressione Enter para sair“);
userInput = Console.ReadLine();
if (userInput == “”)
{
digitou = false; //quer sair
}
/* aqui pode ser lançada uma exceção de
conversão se o usuário digitar texto ao
invés de número
*/
int index = Convert.ToInt32(userInput);
if (index < 0 || index > 5)
{
//lançamos uma exceção
throw new IndexOutOfRangeException(
“You typed in “ + userInput);
}
//imprime o número
Console.WriteLine(“Você digitou: “ + index);
} //fim do try
catch (IndexOutOfRangeException e)
{
Console.WriteLine(“Exception: “ +
“Número deve estar entre 0 e 5. “ +
e.Message);
} //fim do catch
catch (Exception e)
{
Console.WriteLine(
“Ocorreu uma exceção conhecida : “ +
e.Message);
} //fim do catch
catch
{
Console.WriteLine(“Alguma exceção
desconhecida ocorreu.”);
} //fim do catch
finally
{
Console.WriteLine(“Obrigado.”);
}//fim do finally
}//fim do while
}//fim do método Main
}//fim da classe Teste
}//fim do namespace TryCatchException
A parte principal desse código é laço de repetição while, que
continuamente utiliza o método Console.ReadLine() para pedir ao
usuário uma nova entrada de valor. Checamos para ver se o usuário
simplesmente apertou Enter porque neste caso, imaginamos que ele
deseja sair do programa.
Observe que criamos ainda um terceiro bloco catch que não especifica o
tipo de exceção. Esse bloco é para o caso em que a exceção ocorrida
não consegue ser tratada por nenhuma classe de exceção do DotNet.
Isso é útil por exemplo quando um erro de sistema inesperado ocorre,
ou quando utilizamos em nossos programas bibliotecas de linguagens
antigas que embora funcionem no DotNet não são completamente
gerenciáveis por ele (como bibliotecas de C++ por exemplo).
if (ErrorCondition == true)
{
Exception myException = new
ClassmyException(“Help!!!!”);
myException.Source = “My Application Name”;
myException.HelpLink = “MyHelpFile.txt”;
throw myException;
}
Blocos de tratamento aninhados
try
{
// Ponto A
try
{
// Ponto B
}
catch
{
// Ponto C
}
finally
{
// finalização
}
// Ponto D
}
catch
{
// tratamento de erro
}
finally
{
// finalização
}
Vamos entender como isso funciona. Se uma exceção for lançada dentro
do bloco try mais externo mas fora do bloco try mais interno (pontos A e
D), então a situação de exceção é capturada pelo bloco catch mais
externo e o bloco finally mais externo é executado. Se uma exceção é
lançada dentro do bloco try interno (ponto B), e a exceção será tratada
pelo bloco catch interno e o bloco finally interno será executado antes
da execução continuar o bloco try externo (no ponto D).
Embora nós tenhamos visto uma situação com apenas dois blocos try
aninhados, o mesmo princípio continua valendo não importa quantos
blocos try você aninhar dentro de outros. A cada estágio, o ambiente de
execução do DotNet irá transferir suavemente o controle para o bloco
catch mais conveniente.
Algumas vezes uma exceção pode ser lançada, mas não há bloco catch
em seu código que esteja apto a tratá-la. O que acontece então?
Por isso, em geral, se você está criando um programa, você deve tentar
capturar o máximo de exceções que você puder, e tratá-las de forma
conveniente. De uma forma geral, as situações que costumam gerar
exceções são situações onde se depende de um fator externo para que o
programa funcione como: