Ainda rolando para baixo? Aqui está!
Esta questão me deu um tempo difícil atrás.
try
{
int a=1;
int b=0;
int c=a/b;
}
catch(Exception ex)
{
console.writeline(ex.Message);
}
finally
{
console.writeline("Finally block");
}
console.writeline("After finally");
o que seria impresso no cenário acima? Sim, adivinhou certo:
ex. Mensagem - seja o que for (provavelmente tentativa de divisão por zero)
Finalmente bloquear
Depois de finalmente
try
{
int a=1;
int b=0;
int c=a/b;
}
catch(Exception ex)
{
throw(ex);
}
finally
{
console.writeline("Finally block");
}
console.writeline("After finally");
O que isso imprimiria? Nada! Ele lança um erro, pois o bloco catch gerou um erro.
Em uma boa estrutura de programação, suas exceções seriam afuniladas, no sentido de que esse código seria tratado a partir de outra camada. Para estimular tal caso, vou tentar este código.
try
{
try
{
int a=1;
int b=0;
int c=a/b;
}
catch(Exception ex)
{
throw(ex);
}
finally
{
console.writeline("Finally block")
}
console.writeline("After finally");
}
catch(Exception ex)
{
console.writeline(ex.Message);
}
Nesse caso, a saída seria:
- Finalmente bloquear
- ex.Message - seja o que for.
É claro que quando você captura uma exceção e a lança novamente em outras camadas (Funilamento), o código após o lançamento não é executado. Ele age de forma semelhante ao funcionamento de um retorno dentro de uma função.
Agora você sabe por que não fechar seus recursos nos códigos após o bloco catch. Coloque-os no bloco finally.