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.