Stiamo avendo un'applicazione WPF in cui parti di essa possono generare eccezioni in fase di esecuzione. Vorrei catturare globalmente qualsiasi eccezione non gestita e registrarle, ma altrimenti continuare l'esecuzione del programma come se nulla fosse successo (un po 'come VB On Error Resume Next
).
È possibile in C #? E se sì, dove dovrei esattamente inserire il codice di gestione delle eccezioni?
Al momento non riesco a vedere nessun singolo punto in cui posso avvolgere un try
/ catch
around e che catturerebbe tutte le eccezioni che potrebbero verificarsi. E anche allora avrei lasciato tutto ciò che è stato eseguito a causa della cattura. O sto pensando in direzioni orribilmente sbagliate qui?
ETA: Perché molte persone sotto lo hanno sottolineato: L'applicazione non è per il controllo di centrali nucleari. Se si arresta in modo anomalo non è un grosso problema, ma le eccezioni casuali che sono per lo più correlate all'interfaccia utente sono un fastidio nel contesto in cui verrebbero utilizzate. Ce n'erano (e probabilmente lo sono ancora) alcuni di questi e poiché utilizza un'architettura plug-in e potrebbe essere esteso da altri (anche studenti in quel caso; quindi nessuno sviluppatore esperto in grado di scrivere codice completamente privo di errori).
Per quanto riguarda le eccezioni che vengono rilevate: le registro in un file di registro, inclusa la traccia dello stack completa. Questo era il punto centrale di quell'esercizio. Solo per contrastare quelle persone che stavano prendendo alla lettera la mia analogia con OERN di VB.
So che ignorare ciecamente determinate classi di errori è pericoloso e potrebbe corrompere la mia istanza dell'applicazione. Come detto prima, questo programma non è fondamentale per nessuno. Nessuno nella loro mente giusta avrebbe scommesso su di essa la sopravvivenza della civiltà umana. È semplicemente un piccolo strumento per testare alcuni approcci progettuali. Ingegneria software.
Per l'uso immediato dell'applicazione non ci sono molte cose che possono accadere su un'eccezione:
- Nessuna gestione delle eccezioni: finestra di dialogo di errore e uscita dell'applicazione. L'esperimento deve essere ripetuto, sebbene probabilmente con un'altra materia. Non sono stati registrati errori, il che è un peccato.
- Gestione generica delle eccezioni: errore benigno bloccato, nessun danno fatto. Questo dovrebbe essere il caso comune giudicato da tutti gli errori che abbiamo riscontrato durante lo sviluppo. Ignorare questo tipo di errori non dovrebbe avere conseguenze immediate; le strutture di dati di base sono testate abbastanza bene da poter sopravvivere facilmente.
- Gestione generica delle eccezioni: errore grave intercettato, possibilmente arresto anomalo in un secondo momento. Questo può succedere raramente. Non l'abbiamo mai visto finora. L'errore viene comunque registrato e un arresto potrebbe essere inevitabile. Quindi questo è concettualmente simile al primo caso. Solo che abbiamo una traccia di stack. E nella maggior parte dei casi l'utente non se ne accorgerà nemmeno.
Per quanto riguarda i dati dell'esperimento generati dal programma: un grave errore causerebbe nella peggiore delle ipotesi la registrazione di dati. Lievi modifiche che cambiano leggermente leggermente il risultato dell'esperimento sono abbastanza improbabili. E anche in quel caso, se i risultati sembrano dubbi, l'errore è stato registrato; si può ancora buttare via quel punto dati se si tratta di un valore anomalo totale.
Riassumendo: Sì, mi considero ancora almeno parzialmente sano e non considero una routine globale di gestione delle eccezioni che lasci il programma in esecuzione necessariamente necessariamente malvagio. Come già detto due volte, tale decisione potrebbe essere valida, a seconda dell'applicazione. In questo caso è stata giudicata una decisione valida e non una cazzata totale e totale. Per qualsiasi altra applicazione tale decisione potrebbe apparire diversa. Ma per favore non accusare me o le altre persone che hanno lavorato a quel progetto per far esplodere il mondo solo perché stiamo ignorando gli errori.
Nota a margine: esiste esattamente un utente per quell'applicazione. Non è qualcosa come Windows o Office che viene utilizzato da milioni di persone in cui il costo di avere eccezioni a tutti gli utenti sarebbe già molto diverso.
On Error Resume Next
non è possibile in C #. Dopo un Exception
(C # non ha "errori") non puoi semplicemente riprendere con la prossima istruzione: l'esecuzione continuerà in un catch
blocco - o in uno dei gestori di eventi descritti nelle risposte seguenti.