通常、例外をスローすることは想定していませんが(プログラミングエラー)、アプリケーションをクラッシュさせたい無効なデータをユーザーに報告するなど)。タスクの予期しない例外を取得してガベージコレクションより前にアプリケーションを終了させる
Tasks
を使用する場合、この動作に近づくためのベストプラクティスはありますか? TaskScheduler.UnobservedTaskException
のハンドラを登録しました。問題は予期しない例外を引き起こすよりも後でが発生する可能性があることです。
質問:もしあれば、私が使用するオプション :
私はのtry/catchで私の
Task
の行動をラップし、私は期待していない例外をキャッチしてエスカレートする必要がありますか?そしてもしそうなら、私は(つまり、私はそれがAppDomain.UnhandledException
イベントを発生し、終了するために取得したいのですがエスカレートして何をすべき。私は、これはのWinFormsアプリケーションで(UIスレッド上で継続(
OnlyOnFaulted
)を添付してください)それは、予想される例外でない場合は、例外を再スローその良く以上の標準的なアプローチがあります
ここで#1がどのように見えるかです:??
var t1 = Task.Factory.StartNew(() =>
{
try
{
string path = null; // Programming error. Should have been a valid string. Will cause System.ArgumentNullException below
using (FileStream fs = File.Create(path))
{
}
}
catch (System.IO.IOException) { throw; } // Expected possible exception
catch (System.UnauthorizedAccessException) { throw; }
catch
{
// Anything caught here is not an expected exception and should be escalated.
// But how?
}
});
はここで#2がどのように見えるかです:継続を取り付け
TaskScheduler uiTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
var t1 = Task.Factory.StartNew(() =>
{
string path = null; // Programming error. Should have been a valid string. Will cause System.ArgumentNullException below
using (FileStream fs = File.Create(path))
{
}
});
t1.ContinueWith(t =>
{
Exception ex = t.Exception;
if (ex is IOException || ex is UnauthorizedAccessException) // Expected exceptions (do nothing)
return;
throw ex; // Not expected (escalate by rethrowing)
}, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, uiTaskScheduler);