問題タブ [unobserved-exception]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
wpf - WPF の非 UI スレッドのキャッチオール例外ハンドラー
具体的には、MVVM で WPF を使用しています。これは、すべてのアクションが発生する WPF ウィンドウです。プロパティ、コマンドなどに対応するビュー モデル クラスを使用します。
次のように、Application.xaml.vb StartUp でメイン UI スレッドと非 UI スレッドの例外ハンドラーを設定しました。
この部分は動作します
これをテストしようとすると、意図的に例外をスローして動作します。[すべて選択] ボタンのクリックを処理するのは、実際には Sub の View Model にあります。
ボタン:
正常にキャッチされた例外をスローしているコマンド:
この部分は機能しません
同じ MainWindow に、同様にコマンドにバインドされた別のボタンがあります。ただし、タスクを使用してバックグラウンドで作業を実行し、そこでスローされた例外はキャッチオール ハンドラーによってキャッチされません。
同様の質問がいくつかありますが、それらから実際に答えを見つけることができませんでした。ほとんどの場合、 AppDomain UnhandledException が答えのようですが、それは私のものではありません。この方法で非 UI スレッドでスローされる可能性のある例外をキャッチできるようにするには、正確に何を追加する必要がありますか?
私がやったこと
Application.xaml.vb でイベント ハンドラーを処理しているときに、TaskScheduler.UnobservedTaskException イベントを取得してイベント ハンドラーを呼び出すことができませんでした。しかし、私は他の答えからヒントを得ました。最終的には役に立ったので、答えとしてマークします。
ただし、これはアプリケーション レベルではないため、これがより大きなアプリケーションである場合は、タスクを使用したすべてのインスタンスでこれを複製する必要があります。これは私が探していたものではありませんでしたが、今はこれ以上時間を費やすつもりはありません。
Task内にtry-catchを配置することになりました。キャッチでは、Dispatcher.Invoke を使用して、ユーザー フレンドリーなダイアログと例外情報を引き続き表示することができました。
c# - UnobservedTaskException のロジックが .net 4.5 で変更されたのはなぜですか?
.net 4.5 UnobservedTaskExceptionでわかっているように、アプリはクラッシュしません。
開発者がタスクに基づいて非同期コードを簡単に記述できるようにするために、.NET Framework 4.5 では監視されない例外の既定の例外動作が変更されています。監視されていない例外は依然として UnobservedTaskException 例外を発生させますが、デフォルトではプロセスは終了しません。代わりに、イベント ハンドラーが例外を監視するかどうかに関係なく、イベントの発生後にランタイムによって例外が処理されます。この動作は構成できます。.NET Framework 4.5 以降では、構成要素を使用して .NET Framework 4 の動作に戻し、プロセスを終了できます。
わかりました、Microsoft が例外を処理するマルチスレッドのエクスペリエンスを変更することを決定したと仮定しますが、なぜそれが tpl のみに適用されたのでしょうか? マルチスレッドメカニズムの他の部分が変更されなかったのはなぜですか? たとえば、次のコードでもアプリがクラッシュします
紛らわしく、非常に奇妙に見えます。これについて何か知っている人はいますか?
c# - dotnetcoreapp2.0 での UnobservedTaskException ハンドラーの使用
次のコードは、netcoreapp2.0 アプリケーションで実行すると、最終的にスローされないようです。UnobservedTaskException
プロジェクトファイルはこちら。UnobservedTaskException
ハンドラーを解雇するにはどうすればよいですか?
他のスタックオーバーフローの投稿で、プロジェクト ファイルで次のスニペットを使用するようにというアドバイスを見たことがありますが、これは .net Framework 4.0 以降のプロジェクトでのみ機能します。.netcore プロジェクト ファイルに相当するものがあれば、それを知る必要があるかもしれません。