Então me deparei com um código esta manhã que se parecia com isso:
try
{
x = SomeThingDangerous();
return x;
}
catch (Exception ex)
{
throw new DangerousException(ex);
}
finally
{
CleanUpDangerousStuff();
}
Agora, esse código compila bem e funciona como deveria, mas simplesmente não parece correto retornar de dentro de um bloco try, especialmente se houver um associado finalmente.
Meu principal problema é o que acontece se o finalmente lança uma exceção por si 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?
c#
try-catch
try-catch-finally
lomaxx
fonte
fonte
x
fora dotry
bloco. Você pode manter sua declaração próxima ao seu uso.Respostas:
Não, não é uma prática ruim. Colocar
return
onde faz sentido melhora a legibilidade e a capacidade de manutenção e torna seu código mais simples de entender. Você não deve se importar, pois ofinally
bloco será executado se umareturn
instrução for encontrada.fonte
O finalmente será executado, não importa o quê, por isso não importa.
fonte
Pessoalmente, eu evitaria esse tipo de codificação, pois não sinto vontade de ver instruções de retorno antes de instruções finalmente.
Minha mente é simples e processa as coisas de maneira linear. Portanto, quando eu percorrer o código para execução a seco, terei a tendência de pensar que, uma vez que eu consiga alcançar a declaração de retorno, tudo o que segue não importa, o que obviamente está muito errado nesse caso (não que isso afete a declaração de retorno, mas quais seriam os efeitos colaterais).
Assim, eu organizaria o código para que a declaração de retorno sempre apareça após as instruções finalmente.
fonte
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 tentar outra estrutura de captura na declaração finalmente, se achar que isso pode gerar uma exceção. O compilador descobrirá quando retornar o valor.
Dito isso, pode ser melhor reestruturar seu código de qualquer maneira, apenas para não confundi-lo mais tarde ou alguém que também não tenha conhecimento disso.
fonte
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 costumam ser mais difíceis de ler e analisar. Mas essa objeção tem mais a ver com declarações de retorno do que catch e, finalmente, bloqueia.
fonte
No seu exemplo, de qualquer maneira é equivalente, eu nem ficaria surpreso se o compilador gerasse o mesmo código. Se uma exceção ocorrer no bloco final, você terá os mesmos problemas, colocando a instrução de retorno em bloco ou fora dela.
A verdadeira questão é estilisticamente qual é a melhor. Eu gosto de escrever meus métodos para que exista apenas uma declaração de retorno; dessa forma, é mais fácil ver o fluxo sair do método; segue-se que eu também gosto de colocar a declaração de retorno por último, para que seja fácil ver que é o final do método e é isso que ele retorna.
Penso que, com a declaração de retorno tão bem colocada como a última, outras são menos propensas a vir e espalhar várias declarações de retorno em outras partes do método.
fonte