2012-07-10 16 views
6

In WinForms che uso:equivalente di System.Windows.Forms.Application.ThreadException per l'applicazione o il servizio Windows Console o qualsiasi processo in generale

  • System.Windows.Forms.Application.ThreadException
  • sistema. Windows.Application.UnhandledException

Cosa devo usare per un'applicazione multi-thread non Winform?

Si consideri il codice completo di seguito in C# .NET 4.0: tonnellate

using System; 
using System.Threading.Tasks; 

namespace ExceptionFun 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 
      Task.Factory.StartNew(() => 
       { 
        throw new Exception("Oops, someone forgot to add a try/catch block"); 
       }); 
     } 

     static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
     { 
      //never executed 
      Console.WriteLine("Logging fatal error"); 
     } 
    } 
} 

ho visto di domande simili su StackOverflow, ma nessuno conteneva una risposta soddisfacente. La maggior parte delle risposte sono di tipo: "Dovresti includere la corretta gestione delle eccezioni nel tuo codice" o "Usa AppDomain.CurrentDomain.UnhandledException".

Modifica: Sembra che la mia domanda sia stata fraintesa, quindi l'ho riformulata e ho fornito un esempio di codice più piccolo.

+1

Questo appare come un duplicato di http://stackoverflow.com/questions/3133199/net-global-exception-handler-in-console-application – Jodrell

+1

In generale, per il log dovrebbe essere utilizzato un gestore di eccezioni globale. Dovresti gestire localmente se c'è qualcosa di sensato che puoi fare riguardo all'eccezione. – Jodrell

+0

Questo dovrebbe funzionare bene. Ovviamente non si desidera utilizzare try/catch, che impedisce l'esecuzione del gestore eventi UnhandledException. Non devi prenderti cura di Die() te stesso, è automatico. –

risposta

0

Non è necessario alcuno strumento equivalente, l'evento CurrentDomain.UnhandledException funziona correttamente nelle applicazioni della console multi-thread. Ma non sta sparando nel tuo caso a causa del modo in cui si avvia il thread. Il gestore della domanda non verrà eseguito in entrambe le applicazioni Windows e Console. Ma se inizi il tuo thread in questo modo (ad esempio):

new Thread(() => { 
    throw new Exception("Oops, someone forgot to add a try/catch block"); 
}).Start(); 

Si spara.

Il problema Task.Factory.StartNew(...) e CurrentDomain.UnhandledException viene discusso in molti post su SO. Controllare alcuni suggerimenti qui:

How to handle all unhandled exceptions when using Task Parallel Library?

What is the best way to catch exception in Task?

Problemi correlati