WebApi 全局异常与局部异常
全局异常过滤器
public class ApiExceptionFilter:ExceptionFilterAttribute { private IHostingEnvironment _env; public ApiExceptionFilter(IHostingEnvironment env) { _env = env; } public override void OnException(ExceptionContext context) { if (context.ExceptionHandled) { return; } var exMsg = context.Exception.Message; ApiResp resp = new ApiResp(ApiRespCode.E999999,exMsg); // 开发环境显示异常信息 if(_env.IsDevelopment()) { resp.Message = exMsg; } context.Result = new JsonResult(resp); context.ExceptionHandled = true; } }
在startup添加这个异常过滤器
services.AddMvc(options=> { options.MaxModelValidationErrors = 5; // 自定义model验证 options.Filters.Add(); // 异常捕获 options.Filters.Add (); }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
在原来的api中写一个简单的测试方法。响应报文的默认构造函数中的message使用自定义的枚举扩展方法获取枚举的message属性,如果是开发环境,将这个message替换为异常信息,调试会比较方便。
[HttpGet] public void test() { int a = 0; int c = 1 / a; }
局部异常
当正常请求进来时,有些时候,我们的接口需要一些条件无法满足,这个时候可以手动抛出异常,因为封装了全局响应报文,这样不会影响系统使用。
public class ApiException:Exception { public ApiException() { } public ApiException(string message) : base(message) { } public ApiException(string message,Exception ex) : base(message, ex) { } public ApiException(ApiRespCode apiRespCode) : base(ApiEnum.GetMessage(apiRespCode)) { } }
在需要地方就可以这样抛出异常:
throw new ApiException(ApiRespCode.E999999);