Esta é uma pergunta relacionada Q: O uso da cláusula Finalmente para fazer o trabalho após o retorno do estilo ruim / perigoso?
No Q referenciado, o código finalmente está relacionado à estrutura usada e à necessidade de pré-busca. Minha pergunta é um pouco diferente e acredito que seja pertinente ao público em geral. Meu exemplo particular é um aplicativo winform C #, mas isso também se aplicaria ao uso em C ++ / Java.
Estou observando alguns blocos try-catch-finalmente onde há muito código não relacionado a exceções e manipulação / limpeza de exceções ocultas dentro do bloco. E admitirei minha tendência a ter blocos muito estreitos de try-catch-finalmente com o código intimamente relacionado à exceção e ao manuseio. Aqui estão alguns exemplos do que estou vendo.
Os blocos de teste terão muitas chamadas preliminares e variáveis sendo configuradas, levando ao código que poderia ser lançado. As informações de log também serão configuradas e executadas no bloco try.
Finalmente, os blocos terão chamadas de formatação de formulário / módulo / controle (apesar de o aplicativo estar prestes a terminar, conforme expresso no bloco catch), além de criar novos objetos, como painéis.
Aproximadamente:
methodName (...)
{
experimentar
{
// Muito código para o método ...
// código que poderia lançar ...
// Muito mais código para o método e um retorno ...
}
pegar (alguma coisa)
{// manipular exceção}
finalmente
{
// alguma limpeza devido a exceção, fechando as coisas
// mais código para o material que foi criado (ignorando que qualquer exceção poderia ter sido lançada) ...
// talvez crie mais alguns objetos
}
}
O código funciona, então há algum valor nele. Não está bem encapsulado e a lógica é um pouco complicada. Estou (dolorosamente) familiarizado com os riscos de mudar o código e refatorar, então minha pergunta se resume a querer conhecer a experiência dos outros com código estruturado de maneira semelhante.
O estilo ruim justifica as mudanças? Alguém foi gravemente queimado por uma situação semelhante? Gostaria de compartilhar os detalhes dessa experiência ruim? Deixe ser porque estou reagindo demais e não é tão ruim de estilo? Ganhar os benefícios de manutenção de arrumar as coisas?
finallyfaz em C #). Qual é o equivalente em C ++? O que estou pensando é em código após o catch, e isso se aplica ao código após o c # finally.
Environment.FailFast(); pode não ser executado se você tiver uma exceção não capturada. E fica ainda mais complicado se você tiver um bloco iterador com finallyo qual itera manualmente.
finally. Todos os bons usos são cobertos por RAII / RRID / SBRM (qualquer sigla que você quiser).