2009-10-21 14 views
23

Un programma C# viene richiamato da:È possibile provare/catturare tutto il programma C# completo?

Application.Run (new formClass()); 

mi piacerebbe mettere un try/catch in tutto il tutto per trattenere eventuali eccezioni non gestite fanno. Quando lo metto attorno a questo metodo Run, le eccezioni non vengono catturate; il controllo ritorna solo qui quando il programma termina dopo un'eccezione non rilevata.

Dove posso mettere try/catch per coprire l'intero programma? Grazie!

+4

Penso che manchi il punto del processo di eccezione, se un'eccezione bolle fino al livello più in alto della tua applicazione, allora c'è qualcosa di sbagliato che deve essere affrontato più in basso nel codice. Metti il ​​try/catch attorno al codice che ritieni possa fallire e fornisci la mitigazione (ove possibile) nella cattura. Se non può essere mitigato, ovvero l'app non può essere ripristinata, l'applicazione deve fallire. – Lazarus

+13

L'OP non sta chiedendo come dovrebbero essere usate le eccezioni - solo come catturarle in un determinato scenario. Ovviamente se un'eccezione bolle al livello superiore, allora qualcosa non va - sembra che voglia scoprire più informazioni quando qualcosa non va, quindi può essere affrontato. La risposta di Mitch è molto più utile di quanto si possa pensare che l'op non sappia cosa sta facendo. – Maggie

+9

La cattura di tutte le eccezioni al livello più alto può essere molto utile per eseguire uno sforzo finale per segnalare ciò che è accaduto prima di uscire. In molti casi penso che sia meglio vedere la finestra di dialogo standard di Windows "questo programma è andato in crash, segnalalo a Microsoft". – noctonura

risposta

37

Per catturare le eccezioni non gestite di Windows Form, collegare gli eventi AppDomain.UnhandledException e Application.ThreadException.

Di interesse: Unexpected Errors in Managed Applications

+2

@alankdkd: assicurarsi di aver letto fino alla fine e la sezione "Alcune migliori pratiche";) – Lazarus

+1

Non è possibile rilevare un'eccezione con 'AppDomain.UnhandledException' (verrà comunque terminata l'applicazione), ma piuttosto ricevere una notifica. Questa è una differenza importante rispetto a 'Application.ThreadException', che è un'eccezione. – Lucero

+0

Non riesco a far funzionare UnhandledException. Ho provato:

 AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler); 
Ma quando c'è un'eccezione, MyHandler non viene mai chiamato. Proverò ThreadException ... – user20493

8

In sostanza, non si può prendere tutte le eccezioni quando si utilizza il CLR predefinito processo di hosting. Periodo. Questo perché l'evento AppDomain.UnhandledException è solo una notifica, non è possibile gestire l'eccezione (il che significa che non è possibile impedire l'interruzione dell'applicazione dopo l'elaborazione della notifica).

Tuttavia, è possibile catturare e gestire tutte le eccezioni nel thread UI di un'applicazione WinForms utilizzando il suo Application.ThreadException gestore (e control the behavior via UnhandledExceptionMode). Altri thread che generano un'eccezione non verranno catturati da questo gestore.

In generale, non è una buona idea provare e gestire tutte le eccezioni. Tuttavia, è possibile utilizzare AppDomain.UnhandledException per registrare l'errore e/o eseguire importanti operazioni di pulizia (ad esempio arrestando un database basato su file o qualsiasi altra cosa).

Problemi correlati