Applicazione console c #: impedisce la finestra di dialogo delle eccezioni predefinita
-
20-08-2019 - |
Domanda
Ho una semplice applicazione con AppDomain singola che viene periodicamente lanciata su un server. A volte si verifica un'eccezione non gestita nell'applicazione e viene visualizzata la finestra di dialogo abort / retry / ignore predefinita. Devo in qualche modo impedire la visualizzazione di edialog e generare l'eccezione su StrErr e chiudere l'applicazione. Quindi ho racchiuso tutto il codice nel metodo principale con l'istruzione try-catch, ma non ha aiutato affatto - la finestra di dialogo delle eccezioni viene ancora mostrata a volte.
Il codice Main () è simile al seguente:
try
{
RunApplication();
}
catch (Exception exc)
{
Console.Error.WriteLine(exc.ToString());
Console.Error.WriteLine(exc.StackTrace);
if (exc.InnerException != null)
{
Console.Error.WriteLine(exc.InnerException.ToString());
Console.Error.WriteLine(exc.InnerException.StackTrace);
}
Environment.Exit(666);
}
Questa clausola try-catch dovrebbe rilevare tutte le eccezioni non gestite e la finestra di dialogo delle eccezioni non dovrebbe mai visualizzare AFAIK. Mi sto perdendo qualcosa? Oppure c'è qualche impostazione (registro, ecc.) Sul server che controlla alcuni comportamenti speciali relativi alla finestra di dialogo delle eccezioni / al codice di errore dell'applicazione?
Soluzione
Esiste un evento di eccezione non gestito a cui puoi iscriverti nel dominio dell'applicazione.
public static void Main()
{
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException);
//some code here....
}
/// <summary>
/// Occurs when you have an unhandled exception
/// </summary>
public static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
//here's how you get the exception
Exception exception = (Exception)e.ExceptionObject;
//bail out in a tidy way and perform your logging
}
Altri suggerimenti
Hai considerato la possibilità che la tua clausola di cattura possa generare eccezioni? Generi discussioni nella tua app principale?