2

現在、私のアプリケーションは次のように未処理の例外をキャプチャします。

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;

ただし、例外が発生すると、次のようになります(例)。

        TimeSpan toExecute = AnyMethod();
        Observable.Timer(toExecute).Take(1).Subscribe((r) =>
        {
            Trace.WriteLine("Subscribe");
            throw new Exception(); // simulation..
        });

例外は(デバッグ時に)無限に繰り返され続けます。リリースモードまたはVisualStudioの外では、アプリケーションはファイナライズされます(AppDomain.CurrentDomain.UnhandledExceptionの標準的な動作
この動作を回避または変更するにはどうすればよいですか?


私の目標は、コードを1回だけ実行することです。例外が発生するかどうかは独立しています。要件の1つは、タイマーによってトリガーされることです。他の何か..例外がある場合は、DispatcherUnhandledExceptionまたはUnobservedTaskExceptionまたは同様の方法で処理する必要があります(これにより、サブスクリプションごとにtry catchを記述して、アプリケーションをシャットダウンできなくなります)

4

1 に答える 1

2

コードは をトリガーAppDomain.CurrentDomain.UnhandledExceptionし、.NET 2.0 以降のアプリケーションの実行を終了します。Visual Studio でそのコードをデバッグすると、未処理の例外通知が繰り返し表示されます。

.NET Framework バージョン 1.0 および 1.1 では、メイン アプリケーション スレッド以外のスレッドで発生する未処理の例外はランタイムによってキャッチされるため、アプリケーションが終了することはありません。したがって、アプリケーションを終了せずに UnhandledException イベントが発生する可能性があります。.NET Framework バージョン 2.0 では、このようなサイレント エラーの累積的な影響には、パフォーマンスの低下、データの破損、およびロックアップが含まれ、これらはすべてデバッグが困難だったため、子スレッドでハンドルされない例外に対するこのバックストップが削除されました。ランタイムが終了しないケースのリストを含む詳細については、マネージド スレッドの例外を参照してください。

AppDomain.UnhandledException Eventのドキュメントを参照してください。

興味のある方のために、スタック トレースを次に示します (.NET 3.5 および Reactive Extensions バージョン 1.0.10621.0 の場合):

System.Exception: Exception of type 'System.Exception' was thrown.

   at yournamespace.MainWindow.<Button_Click>b__0(Int64 r) in path\MainWindow.xaml.cs:line XX
   at System.Reactive.AnonymousObserver`1.Next(T value)
   at System.Reactive.AbstractObserver`1.OnNext(T value)
   at System.Reactive.AnonymousObservable`1.AutoDetachObserver.Next(T value)
   at System.Reactive.AbstractObserver`1.OnNext(T value)
   at System.Reactive.Linq.Observable.<>c__DisplayClass2ff`1.<>c__DisplayClass301.<Take>b__2fe(TSource x)
   at System.Reactive.AnonymousObserver`1.Next(T value)
   at System.Reactive.AbstractObserver`1.OnNext(T value)
   at System.Reactive.AnonymousObservable`1.AutoDetachObserver.Next(T value)
   at System.Reactive.AbstractObserver`1.OnNext(T value)
   at System.Reactive.Linq.Observable.<>c__DisplayClass35b.<>c__DisplayClass35d.<Timer>b__35a()
   at System.Reactive.Concurrency.Scheduler.Invoke(IScheduler scheduler, Action action)
   at System.Reactive.Concurrency.ThreadPoolScheduler.<>c__DisplayClass5`1.<Schedule>b__3(Object _)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading._TimerCallback.PerformTimerCallback(Object state)
于 2012-12-28T19:35:35.913 に答える