就是这样。
在MVC或Web APO中编写自定义异常过滤器时,
OnExceptionAsync
和OnException
方法有什么区别?
是不是只有使用异步控制器时才会调用OnExceptionAsync
?还是两者都被调用?
什么时候使用哪个?
如何使用
OnExceptionAsync
返回任务结果?
一些基本代码来说明:
public class ApiExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
//TODO exception handling
}
public override Task OnExceptionAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
{
//TODO exception handling
}
}
我认为 OnExceptionAsync 与异步操作一起使用。
如果您想要一个简单的场景,例如发送错误的可序列化描述,您可以重写 OnException 而不是 OnExceptionAsync,因为 OnExceptionAsync 在 ExceptionFilterAttribute 默认实现中调用 OnException :
public override void OnException(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)
{
actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(HttpStatusCode.InternalServerError, new
{
Message = "An unexpected error has occured",
Description = actionExecutedContext.Exception.Message
});
actionExecutedContext.Response.Headers.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue()
{
NoCache = true,
NoStore = true
};
}
但是您可能希望将异常记录在数据库中并利用异步行为:
public override async Task OnExceptionAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
{
await LogException(actionExecutedContext.Exception);
}
async 和await 关键字将为您完成管理异步行为的工作。您不需要返回 Task 对象。