Questa è una domanda correlata D: L' uso della clausola finally per eseguire il lavoro dopo il ritorno in cattivo stile / pericoloso?
Nella Q referenziata, il codice finally è correlato alla struttura utilizzata e alla necessità del pre-recupero. La mia domanda è un po 'diversa e credo che sia pertinente per il vasto pubblico. Il mio esempio particolare è un'app winform C #, ma questo si applicherebbe anche all'utilizzo C ++ / Java.
Sto notando alcuni blocchi try-catch-finally in cui è presente un sacco di codice non correlato alle eccezioni e alla gestione / pulizia delle eccezioni sepolte all'interno del blocco. E ammetterò la mia propensione ad avere blocchi try-catch-finally molto serrati con il codice strettamente correlato all'eccezione e alla gestione. Ecco alcuni esempi di quello che sto vedendo.
I blocchi di prova avranno molte chiamate preliminari e variabili impostate che portano al codice che potrebbe essere lanciato. Le informazioni di registrazione verranno configurate ed eseguite anche nel blocco try.
Infine, i blocchi avranno chiamate di formattazione form / module / control (nonostante l'app stia per terminare, come espresso nel blocco catch), oltre a creare nuovi oggetti come i pannelli.
Circa:
methodName (...) { provare { // Un sacco di codice per il metodo ... // codice che potrebbe generare ... // Molto più codice per il metodo e un ritorno ... } cattura (qualcosa) {// gestisce l'eccezione} finalmente { // un po 'di pulizia a causa di un'eccezione, chiusura delle cose // più codice per le cose che sono state create (ignorando che eventuali eccezioni avrebbero potuto essere lanciate) ... // forse crea altri oggetti } }
Il codice funziona, quindi ha un certo valore. Non è ben incapsulato e la logica è un po 'contorta. Conosco (dolorosamente) i rischi legati allo spostamento del codice e al refactoring, quindi la mia domanda si riduce a voler conoscere l'esperienza degli altri con un codice strutturato in modo simile.
Lo stile cattivo giustifica le modifiche? Qualcuno è stato gravemente bruciato da una situazione simile? Ti andrebbe di condividere i dettagli di quella brutta esperienza? Lasciarlo perché sto reagendo troppo e non è poi così male lo stile? Ottieni i vantaggi di manutenzione di mettere in ordine le cose?
finally
fa in C #). Qual è l'equivalente in C ++? Quello a cui sto pensando è il codice dopo il catch
, e questo vale lo stesso per il codice dopo il C # finally
.
Environment.FailFast()
; potrebbe non essere eseguito se hai un'eccezione non rilevata. E diventa ancora più complicato se hai un blocco iteratore con finally
cui fai l'iterazione manuale.
finally
. Tutti i buoni usi sono coperti da RAII / RRID / SBRM (qualunque acronimo ti piaccia).