ユニットテストでAppDomain.UnhandledExceptionハンドラが起動しない

以下のコードスニペットで、ユニットテストで例外がスローされたときに、( AppDomain.CurrentDomain.UnhandledException イベントの)添付ハンドラが起動しないのはなぜですか?

私はVS2010でTestDriven.NET 3.0とNUnit 2.5.10を使用しています。

[TestFixture]
public class MyTests {

    private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
        Console.WriteLine("Gotcha!");
    }

    [Test]
    public void ExceptionTest1() {
        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
        throw new Exception("ExceptionInTest");
    }

}

アウトプット:(落とし穴なし)

------ Test started: Assembly: WcfQueue.Test.dll ------

Test 'xxxxx.Test.MyTests.ExceptionTest1' failed: System.Exception : ExceptionInTest
    ProgramTests.cs(83,0): at xxxxx.Test.MyTests.ExceptionTest1()

0 passed, 1 failed, 0 skipped, took 1.98 seconds (NUnit 2.5.5).

Update: The purpose of this question is NOT to test .Net framework or NUnit. I just want to find out the reason why, in a unit test, the handler wouldn't fire.

4
あなたはここで何を試そうとしていますか?それがあなたがテストしているコードの未処理の例外ハンドラである場合、AppDomainはあなたがテストしているアプリケーションではないでしょう、それはアプリケーションテスターです...例外をテストする場合は、例外のGoogle NUnitをテストします。
追加された 著者 Tony Hopkinson,
なぜネットをテストしていますか?あなたに自由時間がたくさんあるなら、私はあなたに何かを見つけることができます。 :)
追加された 著者 Tony Hopkinson,
うーん、それを読み返す。既存のイベントハンドラのデリゲートを定義して、そこに終了イベントを指しているので、そうだと思います。おそらくあなたの他のテストはすべて終わったでしょうか?もしあなたがそれをうんざりさせようとしているなら、私は個人的には納得できません。
追加された 著者 Tony Hopkinson,
少なくとも深刻ではなかった。あなたが3つのスペースでインデントしたいと思っていたら、戦いを意味するでしょう! :)
追加された 著者 Tony Hopkinson,
NUnitが例外を捕捉できないように別のスレッドを開始してください。
追加された 著者 Hans Passant,
最初に私はCurrentDomain_UnhandledExceptionが正常に動作したかどうかをテストしようとしていましたが、それはテスト実行中に実行されなかったためです。私はちょうどなぜそれがしなかったかを知りたい。私の目的は、メソッドが例外をスローするかどうかをテストすることではありません。
追加された 著者 henginy,
@ HansPassantありがとう、これは動作します!したがって、NUnitはtry-catchブロックでテストを実行するだけで、独自のAppDomainにはunhandled_exception_handlerがありません。これを回答として投稿してください、私はそれを受け入れます。
追加された 著者 henginy,

3 答え

例外は、その例外、AppDomain境界、またはスタックの最上位(優先順位の順)を処理できるtry/catchブロックに到達するまで、コールスタックを呼び起こします。

NUnitが提供するのと同じAppDomain内で実行している場合、NUnitは例外をキャッチします。これにより、イベントを呼び出したAppDomain境界線がプリエンプションされます。

したがって、新しいAppDomainを作成してそこでコードを実行する必要があります(AppDomain.UnhandledExceptionのイベントハンドラを追加するセットアップを含む)。すべてが期待どおりに機能するはずです。

3
追加された
私はそれが最も詳細なので、この答えを受け入れています。スレッドを作成すると、Hans Passantが示唆したNUnitのcatch節も回避されます。
追加された 著者 henginy,

私が知る限り、未処理の例外イベントは、既定のAppDomainでのみトリガされます。私はあなたのイベントがトリガされない理由は、別のAppDomainテストを実行するためにNUnitを使用すると思います。

2
追加された
私は同じトラックにあります、NUnitは別のAppDomainを使用します( nunit .org/index.php?p = assemblyIsolation&r = 2.5.7 )。しかし、MSDNでは、「このイベントはどのアプリケーションドメインでも処理できます」( msdn.microsoft.com/en-us/library/… )、これは私の考えです:私は私のデフォルトのアプリケーションドメインからこの例外をキャッチすることができましたが、私はできないので、NUnit UnhandledExceptionを持っている必要がありますハンドラを独自のAppDomainに追加します。
追加された 著者 henginy,
しかし問題があります。ハンドラをテスト自体に登録しています。したがって、NUnitのAppDomainに登録する必要があります。
追加された 著者 henginy,

例外が処理されるため、イベントは発生しません。テストフレームワークによって、レポートを生成する。

2
追加された
あなたは何を言っていますか?あなたはあなたの質問に貼り付けた出力のすぐそこに出力します: Test 'xxxxx.Test.MyTests.ExceptionTest1' failed:System.Exception:ExceptionInTest コード>
追加された 著者 Joe White,
可能であれば、フレームワークがレポートを生成するためにそれを処理すると、出力に表示されないのはなぜですか?
追加された 著者 henginy,
+1は正しい方向を指します。
追加された 著者 henginy,
あっ、すみません。私はそれを逃した未処理の例外ハンドラの出力を見てみることにとても関わっていました。それを指摘してくれてありがとう。
追加された 著者 henginy,