根据文档 HttpResponseException
由 Web API 自动处理,Web API 应该只是返回HttpResponseMessage
给客户端对应的HttpStatusCode
. 它工作......通常。
HttpResponseException
但是,如果我们从标记为的操作中抛出,async
那么这将不起作用,并且HttpResponseException
只会使整个服务崩溃,并显示“异常已被用户代码未处理”消息。添加自定义异常过滤器并不能解决问题,因为 Web API 不会捕获HttpResponseException
消息。
更新 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