2013-05-23 25 views
8

すべての未処理の例外をキャッチする小さなライブラリを作成しています。これは、ユーザーに開発者に例外を送信する機会を与える小さなダイアログ(NFの通常のダイアログに似ています)を示しています。これを行うには、私はこのようなのAppDomainのUnhandledExceptionイベントを使用します。UnhandledExceptionイベントが機能しませんか?

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のとExEntryは私のライブラリのクラスです。しかし:例外が発生した場合、コンパイラはLambda-Expressionにジャンプし、コードの最初の行をデバッグしようとし、残りのラムダを処理せずに前に発生したエラーを表示します。 しかし、私はちょうど書く場合:

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

これは完全に動作します。なぜこれがうまくいかないのか考えている人はいますか?

+1

try catchでトップコードを折り返し、キャッチにウォッチポイントを入れます。例外がありますか、もしあればそれは何ですか? – TheKingDave

+0

テストユニットで例外ハンドラの作成を単にテストするのはどうですか?何よりも何が起こるの? –

答えて

3

2つの理由が考えられます。

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

もう一つは、あなたがThreadExceptionを処理しなかったことかもしれない、とスローされた例外が未処理の例外が、スレッドの例外ではありませんでした:可能

一つは、あなたが適切UnhandledExceptionModeを設定していたことです。私の経験で

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

を、これは動作しません:例であり、あなたがあなたのシナリオに応じて、それを修正する必要があります後

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

しかし、この処理が行われます。

[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(); 
} 

多分グローバルハンドラをApplication.Run()の前に設定する必要があります

関連する問題