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<VldFilter>();
    // 异常捕获
    options.Filters.Add<ApiExceptionFilter>();
}).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);

 

posted @   原来是李  阅读(436)  评论(0编辑  收藏  举报
编辑推荐:
· 时间轮在 Netty , Kafka 中的设计与实现
· MySQL 优化利器 SHOW PROFILE 的实现原理
· 在.NET Core中使用异步多线程高效率的处理大量数据
· 聊一聊 C#前台线程 如何阻塞程序退出
· 几种数据库优化技巧
阅读排行:
· 跟着 8.6k Star 的开源数据库,搞 RAG!
· .NET 9 中的 多级缓存 HybridCache
· 夜莺 v8 第一个版本来了,开始做有意思的功能了
· .NET 9 增强 OpenAPI 规范,不再内置swagger
· 推荐一个C#轻量级矢量图形库
点击右上角即可分享
微信分享提示