【5min+】AspNet Core中的全局异常处理
句幽 人气:0
## **系列介绍**
【五分钟的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,表明异常已经处理过了。如果不更改的话,嘿嘿
加载全部内容
- 猜你喜欢
- 用户评论