【5min+】AspNet Core中的全局异常处理

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

【5min+】AspNet Core中的全局异常处理

句幽   2020-03-09 我要评论
## **系列介绍** 【五分钟的dotnet】是一个利用您的碎片化时间来学习和丰富.net知识的博文系列。它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net知识等等。 5min+不是超过5分钟的意思,"+"是知识的增加。so,它是让您花费5分钟以下的时间来提升您的知识储备量。 ## **正文** 其实一说到AspNet Core里面的全局异常,其实大家都不会陌生。因为这玩意儿用的非常频繁,好的异常处理方案能够帮助开发者更快速的定位问题,也能够给用户更好的用户体验。 比如,当您访问到一个网页,突然,它喵的报错了!您没有看错,它报错了!!!然后显示了这样的一个错误页面: ![x](https://images.cnblogs.com/cnblogs_com/uoyo/1627547/o_200309082456QQ%E6%88%AA%E5%9B%BE20200309162017%E5%89%AF%E6%9C%AC.png) 请问,此刻电脑屏幕前的您会什么感受。(*真想掏出那传说中的95级史诗巨剑!*) ![x](https://images.cnblogs.com/cnblogs_com/uoyo/1627547/o_200309082951QQ%E6%88%AA%E5%9B%BE20200309163007.png) 但是,假若我们稍微处理一下这个异常,比如用咱们腾讯爸爸的手段,换个皮肤: ![x](https://images.cnblogs.com/cnblogs_com/uoyo/1627547/o_2003090827341.png) 用户马上就会想:“哎呀,错误就错误嘛,孰能无过,程序员锅锅也挺辛苦的。” 由此可见!!!全局异常的捕获和处理是有多么的重要。 ## **AspNet Core 中的全局处理** ### **IAsyncExceptionFilter** 那么在AspNet Core中我们该如何捕获和处理异常呢? 可能很多同学都知道:`IExceptionFilter` 。 这个过滤器应该算是AspNet里面的老牌过滤器了,从很早就延续至今,它允许咱们捕获AspNet Core的控制器中的错误。不过,对于使用 `IExceptionFilter`,其实我更建议您考虑它的异步版本: `IAsyncExceptionFilter`。(*别问为什么,问就是爱的供养*)。 那么我们来看看该过滤器是怎么使用的呢? 下面以 `IAsyncExceptionFilter` 为例,对于同步版本其实也是一样的: ```csharp public class MyCustomerExceptionFilter : IAsyncExceptionFilter { public Task OnExceptionAsync(ExceptionContext context) { if (context.ExceptionHandled == false) { string msg = context.Exception.Message; context.Result = new ContentResult { Content = msg, StatusCode = StatusCodes.Status200OK, ContentType = "text/html;charset=utf-8" }; } context.ExceptionHandled = true; //异常已处理了 return Task.CompletedTask; } } ``` 上面咱们新建了一个自定义的异常过滤器,代码很简单,就是报错了之后依旧让Http返回状态码为200的结果。并且将错误信息返回到客户端。 然后还需要在 `Startup.cs` 中,告诉 `MVC` 咱们新加的这个过滤器: ```csharp services.AddControllers(options => options.Filters.Add(new MyCustomerExceptionFilter())); ``` 然后就完了,是不是so easy? 来看看结果: ```csharp [HttpGet] public IEnumerable Get() { throw new Exception("has error!"); } ``` ![x](https://images.cnblogs.com/cnblogs_com/uoyo/1627547/o_200309084727QQ%E6%88%AA%E5%9B%BE20200309164736.png) 如果不增加该过滤器,我们将得到Http状态码为500的响应。这对于某些不致命的意外操作来说,有点杀鸡用牛刀的感觉,对于前端用户来说也不是很友好(明明输错了一个字符,就直接被告知网站崩溃,并且出现乔殿下)。 而咱们捕获了异常,进行特殊处理之后就显得很友好了。(返回200,并且告诉用户输错了某字符等)。 在上面的代码中,您会看到有一行 `context.ExceptionHandled = true;`。**注意!!!** 这很关键,当您处理完异常之后,请记得将此属性更改为true,表明异常已经处理过了。如果不更改的话,嘿嘿

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们