WebAPI笔记:WebApi异常处理

测试代码链接

异常过滤器特性:
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}"
            }));
    }

}

猜你喜欢

转载自blog.csdn.net/qq_39827640/article/details/107646550