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 throw
você 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.