1
resposta

Por quê não mostrou os 2 erros?

Preciso de uns esclarecimentos:

Quando ele fez um catch com a classe Exception eu imaginei que apareceria os dois erros, as duas Message e as duas StackTrace, mas só apareceu o erro "Referencia do objeto não definida para uma instância de um objeto".

Então, pelo que entendi ele tratou o primeiro erro que apareceu, e finalizou sem chegar no erro de divisão por zero?

Outra coisa, o objetivo do try/catch é tratar o erro e dar continuidade do código, pra ele não interromper abruptamente? Se for isso, então ele deveria ter mostrado os dois erros?

Fiquei bem confusa agora.

1 resposta

O catch sempre vai capturar a primeira exception, não vai passar por todas. Você pode fazer alguns testes pra tentar melhorar esse entendimento. Se executar o código de exemplo abaixo, vai perceber que isso não funciona.

try{
    MyMethod();
}
catch (Exception){
    // alguma tratativa
    throw;
}
catch (NullReferenceException){
    // outra tratativa
    throw;
}

Isso acontece por que Exception é a classe base de qual todas as outras herdam, então qualquer exception já vai cair no primeiro catch e o próprio compilador já não vai aceitar, já que o segundo catch seria inalcançavel.

Outra dúvida que percebi que vc ficou é sobre o fluxo da linguagem. Quando ocorre uma exception e você deixa ela fazer o throwvocê está interrompendo a execução e essa exception será enviada para os métodos que chamaram o que causou a exceção. Se nenhum desses métodos tratarem a exceção para permitir a execução de alguma outra forma, o erro irá "estourar" na tela pro usuário. Muitas vezes a tratativa da exception é apenas retornar uma mensagem mais amigável para o usuário para que ele possa realizar a ação de outra forma.

Para entender essa parte, vou deixar um segundo exemplo pra você executar:

class Program
{
    static void Main(string[] args)
    {
        try{
            MyMethod2(null);
        }
        catch (NullReferenceException){
            throw;
        }
        catch (DivideByZeroException){
            throw;
        }
        catch (Exception){
            throw;
        }
    }

    public static void MyMethod2(Conta conta)
    {
        int zero = 0;
        var umValorQualquer = 100 / zero;
        conta.Saldo = 100;
    }
}

Observe o método MyMethod2. Ele possui dois erros, sendo o primeiro, uma divisão por zero e o segundo a tentativa de acessar uma propriedade de uma classe que está nula (NullReferenceException). Mas, nesse código, ele nunca vai exibir a exceção NullReferenceException por que antes de chegar nela está ocorrendo a DivideByZeroException, então, chegando nesse ponto a aplicação já interrompe e envia a exception pro Main (que é o método que chamou o MyMethod2). E em qual exception ele vai cair? Como o tipo retornado é DivideByZeroException, ele vai cair no segundo catch. Execute o código e faça o debug dele, mude as ordens dos erros do MyMethod2 e dos catch e isso vai fazer você começar entender um pouco melhor as exceptions.