6

ドキュメント によると、HttpResponseExceptionこれらは Web API によって自動的に処理され、Web API はHttpResponseMessage対応するHttpStatusCode. そして、それは機能します...通常。

HttpResponseExceptionしかし、 でマークされたアクションからスローするとasync、これは機能せず、HttpResponseException「ユーザー コードによって例外が処理されませんでした」などのメッセージでサービス全体がクラッシュします。HttpResponseExceptionWeb API がメッセージをキャッチしないため、カスタム例外フィルターを追加しても問題は解決しません。

更新 1 さらに調査したところ、await修飾子をアクションに追加するとすぐに、このアクションからの未処理の例外がすべて Web API サービスをクラッシュさせることがわかりました。また、ExceptionFilterAttributes は関与せず、Web API はそれらを実行しません。実際の非同期コードから例外をスローする必要さえありませんasync。アクションに追加して、すべての例外を完全に処理しないようにするだけで十分です。

ここでは、これは問題なく動作します。例外は、いくつかの例外フィルターによってキャッチできます。

public void Test()
{
    throw new Exception("Hello");
}

これにより、サービスがクラッシュします。

public async void Test()
{
    throw new Exception("Hello");
}

更新 2voidさて、実際の型に 変更すると、すべてが正常に機能するように見えます。

public async Task<int> Test()
{
    throw new Exception("Hello");
}

async voidそのため、サービスがクラッシュする原因による未処理の例外のように見えますが、async Task<SomeType>うまく機能し、例外フィルターは例外をすべてキャッチしHttpResponseExceptionHttpResponseExceptionWeb API によって正しく処理されます。

独り言のようですが、アクションの例外async voidが正しく処理されない理由を調べると面白いでしょうか?

4

1 に答える 1

5

避けるべき理由の 1 つは、async voidこれらのメソッドがエラー処理を行う方法です。

async voidメソッドは、イベント ハンドラーとして使用することを目的としています。他のすべてasyncのメソッドはasync Taskまたはである必要がありますasync Task<T>async同期をvoid返すメソッドに相当するのはではasync Taskなくです async void

asyncタスク オブジェクトを返すメソッドは、そのタスク オブジェクトに例外を配置します。メソッドには task オブジェクトがないため、メソッドの実行開始時にアクティブだった でasync void例外を発生させて例外を処理します。これは、イベント ハンドラーの動作をエミュレートします。SynchronizationContextasync void

于 2013-02-15T05:47:02.020 に答える