when - try catch on c#




É uma prática ruim retornar de dentro de um try catch finally block? (4)

Funcionalmente não há diferença.

No entanto, há uma razão para não fazer isso. Métodos mais longos com vários pontos de saída são geralmente mais difíceis de ler e analisar. Mas essa objeção tem mais a ver com as declarações de retorno do que com os blocos catch e finally.

Então me deparei com algum código esta manhã que ficou assim:

try
{
    x = SomeThingDangerous();
    return x;
}
catch (Exception ex)
{
    throw new DangerousException(ex);
}
finally
{
    CleanUpDangerousStuff();
}

Agora este código compila bem e funciona como deveria, mas simplesmente não parece certo retornar de dentro de um bloco try, especialmente se houver um associado finalmente.

A minha principal questão é o que acontece se, finalmente, lançar uma exceção do seu próprio? Você tem uma variável retornada, mas também uma exceção para lidar ... então estou interessado em saber o que os outros pensam sobre retornar de dentro de um bloco try?


Isso pode responder sua pergunta

O que realmente acontece em uma tentativa {return x; } finalmente {x = null; } declaração?

Ao ler essa pergunta, parece que você pode ter outra estrutura de captura try na instrução finally se achar que pode lançar uma exceção. O compilador descobrirá quando devolver o valor.

Dito isso, talvez seja melhor reestruturar seu código de qualquer maneira, para que não o confunda mais tarde ou alguém que também não esteja ciente disso.


No seu exemplo, de qualquer forma é equivalente, eu nem sequer ficaria surpreso se o compilador gerasse o mesmo código. Se uma exceção acontece no bloco finally, você tem os mesmos problemas, quer você coloque a declaração de retorno no bloco ou fora dela.

A verdadeira questão é estilisticamente qual é o melhor. Eu gosto de escrever meus métodos para que haja apenas uma declaração de retorno, desta forma é mais fácil ver o fluxo para fora do método, segue-se que eu também gosto de colocar a declaração de retorno por último, por isso é fácil ver que é o fim do método e isso que ele retorna.

Eu acho que com a declaração de retorno tão bem colocada como a última declaração, outros são menos propensos a vir e espalhar múltiplas declarações de retorno em outras partes do método.


O finalmente será executado não importa o que, então não importa.





try-catch-finally