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?
finally
faz 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 finally
o qual itera manualmente.
finally
. Todos os bons usos são cobertos por RAII / RRID / SBRM (qualquer sigla que você quiser).