我正在使用 ASP.NET Web API 创建一个 HTTP API。我注意到,如果发生我未处理的异常,则该行为与我故意抛出 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 与它处理异常的方式不一致?我是否自己在做一些事情来导致这种不一致?它看起来相当混乱且难以使用,并且可能意味着必须对调用应用程序进行编码以处理两种不同类型的错误响应:(