これは、例外がセカンダリスレッドでスローされたときに発生する可能性があります。このページの備考セクションを参照してください。
スタンドアロンまたはブラウザーでホストされるWPFアプリケーションは、Applicationクラスを使用して、未処理の例外を検出します(DispatcherUnhandledExceptionを参照)。ただし、Applicationは、Applicationクラスが実行されているのと同じスレッドでスローされた未処理の例外のみを検出できます。通常、アプリケーションには1つのメインユーザーインターフェイス(UI)スレッドがあるため、Applicationクラスの未処理の例外検出動作は適切です。ただし、セカンダリスレッドでスローされた未処理の例外は、メインUIスレッドのApplicationクラスによって自動的に検出されません。
このイベントを使用して、例外
をキャッチ検出し、エラーをログに記録してみてください: AppDomain.UnhandledException Event
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
static void MyHandler(object sender, UnhandledExceptionEventArgs args) {
Exception e = (Exception) args.ExceptionObject;
Console.WriteLine("MyHandler caught : " + e.Message);
}
アップデート:
スレッドの問題とは別に、try...catchブロックを間違った場所に置いた場合にも原因となる可能性があります。この例を考えてみましょう。
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
Do();
}
private void Do()
{
try
{
int result = new ClassLibrary1.Class1().Calculate(2, 4);
}
catch (System.Exception ex)
{
Console.WriteLine("MyHandler caught by try...catch: " + ex.Message);
}
}
}
これにより、Do()が呼び出された行で例外が発生します。これは、ここでCLRがこの時点でアセンブリを解決しようとするためです。例外はキャッチされず、アプリは終了します。
しかし、これを試してみると:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
try
{
Do();
}
catch (System.Exception ex)
{
Console.WriteLine("MyHandler caught by try...catch: " + ex.Message);
}
}
private void Do()
{
int result = new ClassLibrary1.Class1().Calculate(2, 4);
}
}
出力は次のとおりです。
myHandlerがtry...catchによってキャッチされました:ファイルまたはアセンブリ'ClassLibrary1、Version = 1.0.0.0、Culture = neutral、PublicKeyToken=null'またはその依存関係の1つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。
UnhandledExceptionイベントは、アセンブリが参照されているのと同じ関数でサブスクライブした場合には発生しないことに注意してください。これも機能します:
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(
(sender, args) =>
{
Exception ex = (Exception)args.ExceptionObject;
Console.WriteLine("MyHandler caught by UnhandledException handler: " + ex.Message);
});
Do();
}
private void Do()
{
int result = new ClassLibrary1.Class1().Calculate(2, 4);
}
結果:
UnhandledExceptionハンドラーによってキャッチされたMyHandler:ファイルまたはアセンブリ'ClassLibrary1、Version = 1.0.0.0、Culture = neutral、PublicKeyToken=null'またはその依存関係の1つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。
それが役に立てば幸い。