2009-06-26 7 views
7

Ho una semplice applicazione con singolo AppDomain che viene periodicamente lanciato su un server. Talvolta si verifica un'eccezione non gestita nell'applicazione e viene visualizzata la finestra di dialogo predefinita abort/retry/ignore. Devo in qualche modo impedire la visualizzazione di edialog e solo emettere l'eccezione su StrErr e chiudere l'applicazione. Quindi ho incluso tutto il codice nel metodo principale con l'istruzione try-catch, ma non è stato di alcun aiuto - la finestra di dialogo delle eccezioni è ancora mostrata a volte.C# applicazione console - impedisce la finestra di dialogo delle eccezioni predefinita

Il codice principale() appare così:

clausola
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); 
} 

Questo try-catch shoud prendere tutte le eccezioni non gestite e la finestra di eccezione dovrebbe mai popup per quanto ne so. Mi sto perdendo qualcosa? O c'è qualche impostazione (registro, ecc.) Sul server che controlla alcuni comportamenti speciali relativi alla finestra di dialogo delle eccezioni/codice di errore dell'applicazione?

+0

Stai parlando di irrompere in eccezioni non gestite? – abhilash

risposta

20

C'è un evento di eccezione non gestibile a cui è possibile iscriversi 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 
    } 
+0

Accidenti, troppo lento. ;-) –

+1

Stavo scrivendo furiosamente, lol :-) –

+0

Non ho ancora lavorato con le appdomain, so solo che le mie applicazioni vengono eseguite all'interno di una ... Questo codice catturerebbe eccezioni che si attivano da thread diversi? –

0

avete considerato la possibilità che il vostro clausola catch può essere gettando eccezioni? Hai generato thread nella tua app principale?

+1

non ci sono altri thread - solo il thread principale. L'unica possibilità che la clausola catch creerebbe un'eccezione che ora vedo è quando exc.StackTrace == null. – Buthrakaur