Pergunta

Então, me deparei com alguns códigos 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 ele simplesmente não se sente bem para voltar a partir de um bloco try, especialmente se houver um associado finalmente.

A principal problema é o que acontece se o finalmente lança uma exceção de seu próprio? Você tem uma variável retornou, mas também uma exceção para lidar com ... então eu estou interessado em saber o que os outros pensam sobre o retorno de dentro de um bloco try?

Foi útil?

Solução

Não, não é uma prática ruim. Colocando return onde faz sentido melhora a legibilidade e facilidade de manutenção e torna seu código mais simples de entender. Você não deve se preocupar como o bloco finally vai ser executado se uma declaração return é encontrado.

Outras dicas

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

Pessoalmente, gostaria de evitar este tipo de codificação como eu não me sinto como ver instruções de retorno antes de finalmente declarações.

A minha mente é simples e processar as coisas, em vez de forma linear. Portanto, quando eu ando através do código de funcionamento a seco, vou ter tendência a pensar que uma vez que eu posso alcançar a instrução de retorno, tudo follow não importa o que obviamente é muito errado neste caso (não que isso afetaria a instrução de retorno, mas o que os efeitos secundários podem ser).

Assim, gostaria de organizar o código para que a instrução de retorno sempre aparecem após os finalmente declarações.

Isto pode responder a sua pergunta

O que realmente acontece em um tente {return x; Finalmente} {x = nulo; } Declaração?

A partir da leitura a essa pergunta, parece que você pode ter outra estrutura try catch na finally se você acha que pode lançar uma exceção. O compilador irá descobrir quando para retornar o valor.

Dito isto, talvez seja melhor para reestruturar o seu código de qualquer jeito só para que ele não confundi-lo mais tarde, ou alguém que pode não ter conhecimento deste bem.

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 muitas vezes mais difícil de ler e analisar. Mas essa objeção tem mais a ver com as declarações de retorno que captura e finally blocos.

No seu exemplo de qualquer forma é equivalente, eu não iria mesmo ser surpreendido se o compilador gerado o mesmo código. Se uma exceção acontece no bloco finally você tem os mesmos problemas se colocam a instrução de retorno na quadra ou fora dela.

A verdadeira questão é estilisticamente que é melhor. Eu gosto de escrever os meus métodos de modo que há apenas uma instruçã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 instrução de retorno última por isso é fácil de ver que é o fim do método e isso que ele retorna.

Eu acho que com a instrução de retorno tão bem colocada como a última declaração, outros são menos susceptíveis de vir e polvilhe Várias devoluções declarações em outras partes do método.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top