2013-05-23 11 views
8

Sto scrivendo una piccola libreria che cattura tutte le eccezioni non gestite, mostra una piccola finestra di dialogo (simile alla solita finestra di dialogo di NF) che offre all'utente la possibilità di inviare l'eccezione allo sviluppatore. Per fare questo, io uso l'UnhandledException-evento del dominio di applicazione in questo modo:UnhandledException Event non funziona?

app.UnhandledException += (object sender, UnhandledExceptionEventArgs e) => 
     { 
      ExceptionHandler handler = new ExceptionHandler((Exception)e.ExceptionObject, ExEntry); 
      UnhandledExceptionListened(handler); 
      if (Properties.Settings.Default.ShowStandardExceptionDialog) 
      { 
       ExceptionDialog exdialog = new ExceptionDialog(handler); 
       exdialog.ShowDialog(); 
      } 
     }; 

ExceptionHandler e ExEntry sono classi della mia biblioteca. Ma: se si verifica un'eccezione, il compilatore salta in Lambda-Expression, prova a eseguire il debug della prima riga di codice e quindi mostra l'errore verificatosi prima senza eseguire il resto del lambda. Ma se ho appena scritto:

app.UnhandledException += (object sender, UnhandledExceptionEventArgs e) => 
     { 
       ExceptionDialog exdialog = new ExceptionDialog(handler); 
       exdialog.ShowDialog(); 
     }; 

funziona perfettamente. Qualcuno ha un'idea del perché questo non funziona?

+1

Avvolgi il tuo codice sorgente in una presa di prova e metti un punto di riferimento nella presa. C'è un'eccezione e se sì cos'è? – TheKingDave

+0

Che dire semplicemente testando la creazione del gestore di eccezioni in un'unità di test? cosa succede di? –

risposta

3

Ci potrebbero essere due ragioni.

Una possibile è che non hai impostato correttamente UnhandledExceptionMode:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

Un altro potrebbe essere che non hai gestire la ThreadException, e l'eccezione generata non era un'eccezione non gestita, ma un'eccezione thread.

seguito è riportato un esempio, si avrebbe bisogno di modificarlo secondo il vostro piano d'azione:

Application.ThreadException+= 
    new ThreadExceptionEventHandler(Log.WriteThreadException); 

AppDomain.CurrentDomain.UnhandledException+= 
    new UnhandledExceptionEventHandler(Log.WriteUnhandledException); 

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

Application.EnableVisualStyles(); 
Application.SetCompatibleTextRenderingDefault(false); 
Application.Run(new Form1()); 
1

Nella mia esperienza, questo non funziona:

public partial class Form1 : Form 
    { 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1Load(object sender, EventArgs e) 
    { 
     Application.ThreadException += ApplicationThreadException; 
     Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 
     AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException; 
    } 

    void ApplicationThreadException(object sender, ThreadExceptionEventArgs e) 
    { 
     //throw new NotImplementedException(); 
    } 

    void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     //throw new NotImplementedException(); 
    } 
    } 

ma questo:

[STAThread] 
static void Main() 
{ 

    Application.ThreadException += ApplicationThreadException; 
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 
    AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException; 

    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Form1()); 
} 

static void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    //throw new NotImplementedException(); 
} 

static void ApplicationThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) 
{ 
    //throw new NotImplementedException(); 
} 

Forse è necessario impostare il gestore globale prima di Application.Run()