La clausola di cattura nello snippet non catturerà mai nulla nella versione di spedizione della tua app. È fa funziona quando lo si esegue con un debugger allegato.
Quello che ti manca è il modo in cui si applica Application.ThreadException. L'evento si attiva ogni volta che viene rilevata un'eccezione non gestita. Questa funzionalità tuttavia è non attivata quando si esegue il debug del codice. Nessun gestore di eccezioni è installato per aumentare l'evento. Questo è stato fatto in modo da avere un modo decente di eseguire il debug delle eccezioni non gestite. Il tuo codice cambia questo comportamento, adesso è un blocco try attivo, il tuo gestore catch ottiene l'eccezione.
Per fare in modo che il codice si comporti nello stesso modo, è necessario modificare la strategia di gestione delle eccezioni non gestita. In questo modo:
[STAThread]
static void Main() {
try {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
Application.Run(new Form1());
}
catch (Exception ex) {
// etc..
}
}
Ora la tua clausola di cattura attirerà sempre l'eccezione. Finché viene generato nel thread principale, non rileverà eccezioni generate nei thread worker. Considerate questo codice invece per la gestione unificata:
[STAThread]
static void Main() {
AppDomain.CurrentDomain.UnhandledException += AllUnhandledExceptions;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
Application.Run(new Form1());
}
private static void AllUnhandledExceptions(object sender, UnhandledExceptionEventArgs e) {
var ex = (Exception)e.ExceptionObject;
// Display or log ex.ToString()
//...
Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(ex));
}
fonte
2012-08-25 19:28:33
grazie per l'ottimo consiglio – armin
Funziona in WPF o solo in Windows Form? –