ASP.NETWebAPIを使用してHTTPAPIを作成しています。処理していない例外が発生した場合、その動作は、意図的にHttpResponseExceptionをスローした場合とは大きく異なることに気付きました。これにより、クライアントがエラーを確実に処理して「理由」メッセージを表示することが困難になります。
たとえば、次のコードを検討してください。
[HttpPost]
public void ThisWillThrowAnError()
{
try
{
var i = 0;
var b = 1 / i; // cause divide by zero exception for testing
}
catch (Exception ex)
{
HttpResponseMessage message = new HttpResponseMessage();
message.ReasonPhrase = "Error: " + ex.Message;
throw new HttpResponseException(message);
}
}
これにより、HTTPヘッダーにエラーがあり、応答コードが500に設定されている応答が作成されます。 エラー:この要求は処理できませんでした。ゼロ除算を試みました。
実際の応答本文は空です。
ただし、try / catchブロックを削除した場合、またはHttpResponseExceptionを手動でスローしない例外が発生した場合は、まったく異なる動作が発生します。ステータスコードはまだ500ですが、ヘッダーメッセージには「内部サーバーエラー」と表示され、メッセージは次のようなJSON形式でエンコードされます。
{
"Message": "An error has occurred.",
"ExceptionMessage": "Attempted to divide by zero.",
"ExceptionType": "System.DivideByZeroException",
"StackTrace": " at ProjectName.Controllers (etc....)"
}
後者の方がデバッグのためのより多くの情報を提供するので私は後者を好むと思いますが、メッセージをカスタマイズしたり、問題に対してユーザーが読み取れるメッセージを提供したりする機能がなくなります。
WebAPIが例外の処理方法と矛盾するのはなぜですか?私はこの矛盾を引き起こすために自分で何かをしていますか?かなり面倒で操作が難しいように思われ、2つの異なるタイプのエラー応答を処理するように呼び出し元のアプリケーションをコーディングする必要があることを意味する場合があります:(