Olá pessoal, hoje continuaremos a falar sobre tratamento de exceções no C#.
Na primeira parte sobre tratamento de exceções, nós apresentamos a estrutura básica do tratamento de exceções em C#. Na segunda parte, vimos como extrair mais detalhes de nossas exceções tratadas.
Hoje, seguiremos nossa série e explicaremos como tratar exceções específicas. O C# nos permite tratar vários tipos de exceções, para isso, basta termos um bloco Catch para cada tipo de exceção a ser tratada.
Não sei se lembram, mas no último artigo mostramos como
obter o nome da classe da exceção, e na ocasião tivemos uma FormatException. No
exemplo de hoje, forçaremos duas exceções e veremos como é possível realizar
tratamentos expecíficos de acordo com o erro apresentado.
Para nosso exemplo, crie uma nova aplicação WindowsForms, adicione um botão na mesma e insira o seguinte código no evento Click do botão.
String str = "4837484789374893748397";
int num = 0;
try
{
num = Convert.ToInt32(str);
}
catch (FormatException
E)
{
MessageBox.Show("Ocorreu um erro de conversão.\n" +
"Erro:
" + E.Message + "\n" +
"________________________________________________________\n"
+
"Pilha
de execução: " + E.StackTrace + "\n"
+
"________________________________________________________\n"
+
"Classe
da exceção: " + E.GetType().Name + "\n"
+
"________________________________________________________\n"
+
"Origem
da exceção: " + E.Source + "\n");
}
finally {
MessageBox.Show("Tentativa de conversão realizada");
}
Observe as mudanças que fizemos no código. Alteramos o bloco cacth para tratar apenas exceções do tipo FormatException e alteramos o valor inicial da variável str.
Com isso, ao executarmos o programa, não receberemos a mensagem do bloco Catch, pois ao converter não teremos uma exceção do tipo FormatException, mas sim uma de um tipo de diferente, pois agora o erro que dá é devido ao valor ser muito grande.
Com isso, podemos inserir mais um bloco catch para tratar exceções diferentes de FormatException. Veja no exemplo abaixo:
String str = "4837484789374893748397";
int num = 0;
try
{
num = Convert.ToInt32(str);
}
catch (FormatException E)
{
MessageBox.Show("Ocorreu um erro de formato na conversão"
+ E.Message);
}
catch (ArithmeticException E)
{
MessageBox.Show("O valor convertido é muito grande." + E.Message);
}
catch (Exception E)
{
MessageBox.Show("Ocorreu um erro desconhecido na conversão."
+ E.Message);
}
finally {
MessageBox.Show("Tentativa de conversão realizada");
}
Como podemos ver, agora tratamos a exceção FormatException, ArithmeticException, e as mais genéricas, Exception. Ou seja, o bloco catch a ser executado, será aquela cuja exceção tratada seja do tipo correspondente à exceção gerada no bloco protegido.
Quando usamos este tipo de tratamento, é interessante sempre iniciarmos o mesmo a partir da exceção mais concreta(FormatException e ArithmeticException) para a mais genérica(Exception), pois ele sempre entrará no primeiro bloco cacth de tipo compatível com a exceção gerada.
É isso aí pessoal, vamos ficando por aqui, espero que tenham gostado e que as informações passadas sejam úteis no seu dia-a-dia.
Ricardo Coelho.