ドキュメント によると、HttpResponseException
これらは Web API によって自動的に処理され、Web API はHttpResponseMessage
対応するHttpStatusCode
. そして、それは機能します...通常。
HttpResponseException
しかし、 でマークされたアクションからスローするとasync
、これは機能せず、HttpResponseException
「ユーザー コードによって例外が処理されませんでした」などのメッセージでサービス全体がクラッシュします。HttpResponseException
Web 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>
うまく機能し、例外フィルターは例外をすべてキャッチしHttpResponseException
、HttpResponseException
Web API によって正しく処理されます。
独り言のようですが、アクションの例外async void
が正しく処理されない理由を調べると面白いでしょうか?