异常过滤器特性:
ExceptionFilterAttribute异常过滤器特性:可以在方法执行期间出现异常,被处理掉,有局限性:只有控制器实例化后,方法执行完之前,出现的异常才能被抓住
在WebApiConfig.cs Register方法中注册实现全部webapi异常捕获:config.Filters.Add(new CustomExceptionAttribute());
在控制器名上添加特性[CustomExceptionAttribute]实现该控制器注册webapi异常捕获。也可以单独对某api方法上添加特性[CustomExceptionAttribute]注册异常捕获
如果异常被try{}catch (Exception ex){}处理掉则ExceptionFilterAttribute异常过滤器特性将不会捕获到异常
public class CustomExceptionAttribute : ExceptionFilterAttribute
{
/// <summary>
/// api异常过滤器特性
/// api在出现异常时触发(控制器构造异常无法捕获)
/// 可以在这里写入异常日志
/// </summary>
/// <param name="actionExecutedContext"></param>
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
Console.WriteLine($"{actionExecutedContext.Request.RequestUri.AbsoluteUri}:{actionExecutedContext.Exception.Message}");
//把出现异常的api请求返回指定内容供前端解析
actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(
HttpStatusCode.OK, new
{
Result = false,
Msg = $"{"请联系管理员:" + actionExecutedContext.Request.RequestUri.AbsoluteUri}:{actionExecutedContext.Exception.Message}"
});
//base.OnException(actionExecutedContext);
}
}
全局异常处理:
控制器实例化/方法错误 GlobalExceptionHandler : ExceptionHandler;不会覆盖异常过滤器特性CustomExceptionAttribute : ExceptionFilterAttribute
在WebApiConfig.cs Register方法中注册实现全部webapi全局异常捕获:config.Services.Replace(typeof(IExceptionHandler), new GlobalExceptionHandler());
/// <summary>
/// 全局异常处理
/// </summary>
public class GlobalExceptionHandler : ExceptionHandler
{
/ <summary>
/ 判断是不是要异常处理
/ </summary>
/ <param name="context"></param>
/ <returns></returns>
//public override bool ShouldHandle(ExceptionHandlerContext context)
//{
// return context.Request.RequestUri.AbsoluteUri.Contains("api") && base.ShouldHandle(context);
//}
/// <summary>
/// 异常处理
/// </summary>
/// <param name="context"></param>
public override void Handle(ExceptionHandlerContext context)
{
Console.WriteLine(context.Exception.Message);
//把出现异常返回指定内容供前端解析
context.Result = new ResponseMessageResult(context.Request.CreateResponse(
HttpStatusCode.OK, new
{
Result = false,
Msg = $"{"请联系管理员:" + context.Exception.Message}"
}));
}
}