系列介绍

【五分钟的dotnet】是一个利用您的碎片化时间来学习和丰富.net知识的博文系列。它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net知识等等。

5min+不是超过5分钟的意思,"+"是知识的增加。so,它是让您花费5分钟以下的时间来提升您的知识储备量。

正文

其实一说到AspNet Core里面的全局异常,其实大家都不会陌生。因为这玩意儿用的非常频繁,好的异常处理方案能够帮助开发者更快速的定位问题,也能够给用户更好的用户体验。

比如,当您访问到一个网页,突然,它喵的报错了!您没有看错,它报错了!!!然后显示了这样的一个错误页面:

请问,此刻电脑屏幕前的您会什么感受。(真想掏出那传说中的95级史诗巨剑!

但是,假若我们稍微处理一下这个异常,比如用咱们腾讯爸爸的手段,换个皮肤:

用户马上就会想:“哎呀,错误就错误嘛,孰能无过,程序员锅锅也挺辛苦的。”

由此可见!!!全局异常的捕获和处理是有多么的重要。

AspNet Core 中的全局处理

IAsyncExceptionFilter

那么在AspNet Core中我们该如何捕获和处理异常呢? 可能很多同学都知道:IExceptionFilter 。 这个过滤器应该算是AspNet里面的老牌过滤器了,从很早就延续至今,它允许咱们捕获AspNet Core的控制器中的错误。不过,对于使用 IExceptionFilter,其实我更建议您考虑它的异步版本: IAsyncExceptionFilter。(别问为什么,问就是爱的供养)。

那么我们来看看该过滤器是怎么使用的呢? 下面以 IAsyncExceptionFilter 为例,对于同步版本其实也是一样的:

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 咱们新加的这个过滤器:

services.AddControllers(options => options.Filters.Add(new MyCustomerExceptionFilter()));

然后就完了,是不是so easy? 来看看结果:

 [HttpGet]
public IEnumerable<WeatherForecast> Get()
{
throw new Exception("has error!");
}

如果不增加该过滤器,我们将得到Http状态码为500的响应。这对于某些不致命的意外操作来说,有点杀鸡用牛刀的感觉,对于前端用户来说也不是很友好(明明输错了一个字符,就直接被告知网站崩溃,并且出现乔殿下)。

而咱们捕获了异常,进行特殊处理之后就显得很友好了。(返回200,并且告诉用户输错了某字符等)。

在上面的代码中,您会看到有一行 context.ExceptionHandled = true;注意!!! 这很关键,当您处理完异常之后,请记得将此属性更改为true,表明异常已经处理过了。如果不更改的话,嘿嘿

【5min+】AspNet Core中的全局异常处理的更多相关文章

  1. ASP.NET Core MVC 中设置全局异常处理方式

    在asp.net core mvc中,如果有未处理的异常发生后,会返回http500错误,对于最终用户来说,显然不是特别友好.那如何对于这些未处理的异常显示统一的错误提示页面呢? 在asp.net c ...

  2. [转] ASPNET Core 中获取应用程序物理路径

    如果要得到传统的ASP.Net应用程序中的相对路径或虚拟路径对应的服务器物理路径,只需要使用使用Server.MapPath()方法来取得Asp.Net根目录的物理路径,如下所示: // Classi ...

  3. 初识AspNet Core中的标识Identity

    AspNet Core中的标识Identity,是用于Web应用程序的成员身份验证系统. 最方便的引入办法是在创建MVC或Pages的Web应用时,直接选择相应的身份验证系统.如图: 如果选择的是“个 ...

  4. SpringBoot中的全局异常处理

    SpringBoot中的全局异常处理 本篇要点 介绍SpringBoot默认的异常处理机制. 如何定义错误页面. 如何自定义异常数据. 如何自定义视图解析. 介绍@ControllerAdvice注解 ...

  5. 在.NET Core程序中设置全局异常处理

    以前我们想设置全局异常处理只需要这样的代码: AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledExc ...

  6. Global Error Handling in ASP.NET Web API 2(webapi2 中的全局异常处理)

    目前,在Web API中没有简单的方法来记录或处理全局异常(webapi1中).一些未处理的异常可以通过exception filters进行处理,但是有许多情况exception filters无法 ...

  7. ASP.NET Core 中间件自定义全局异常处理

    目录 背景 ASP.NET Core过滤器(Filter) ASP.NET Core 中间件(Middleware) 自定义全局异常处理 .Net Core中使用ExceptionFilter .Ne ...

  8. WEB 项目中的全局异常处理

    在web 项目中,遇到异常一般有两种处理方式:try.....catch....:throw 通常情况下我们用try.....catch.... 对异常进行捕捉处理,可是在实际项目中随时的进行异常捕捉 ...

  9. 7.2WebApi2中的全局异常处理

    现在在WebApi中还没有一种简单的方式去记录或者处理全局的异常.一些未处理的异常可以处理通过异常过滤器,但有大量的异常是异常过滤器不能处理的.例如: 从控制器的构造函数引发的异常. 从消息处理程序引 ...

随机推荐

  1. bootstrap 学习 ---css样式学习

    bootstrap 适用于响应式布局,移动设备优先的web项目 1.学习bootstrap需要引入bootstrap的css,jquery,bootstrap的js,注意:jquery文件必须在boo ...

  2. TreeviewEditor.rar

    本工具可以打开.保存指定格式的XML文件. 树形控件的节点可以编辑.删除.增加.使用本工具看方便地创建书或论文的目录大纲,我用这个工具已经写了好几本书了. 动态图1: 动态图2:编辑效果,支持节点拖曳 ...

  3. 奇点云 x 阿里云 | 联合发布综合体数字化转型与数据创新解决方案

    2019年7月25日下午,在阿里云峰会上海站,奇点云入选阿里云首批联合解决方案合作伙伴,并联合发布了“综合体数字化转型与数据创新解决方案”,共同探索综合体的智能服务. 关于综合体的数字化转型,奇点云联 ...

  4. 吴裕雄--天生自然 HADOOP大数据分布式处理:使用WinSCP连接本机与虚拟机

  5. json转换为go类文件,js脚本,nodejs执行

    js写的代码生成脚本,json生成对应的go type对象 作json转换用 js脚本无甚何依赖,可以直接运行 执行前,按需更改文件 示例 var topname="Data"; ...

  6. labview线程相关

    两个结论.     1. 在 LabVIEW 上编写多线程程序非常方便,我们应该充分利用这个优势.一般情况下,编写程序时应当遵循这样的原则:可以同时运行的模块就并排摆放,千万不要用连线,顺序框等方式强 ...

  7. Mac系统常用软件

    1.往移动硬盘中拷贝东西.创建文件夹: Mounty 2.解压缩软件(rar): the unarchiver 3.类似Xshell软件: FinalShell(国产) 输入以下命令: curl -o ...

  8. JDBC之BaseDao类

    package com.it.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prep ...

  9. node.js 和 npm/cnpm/nrm 的安装

    node.js 和 npm/cnpm/nrm 的安装 安装 node.js.去 官网 下载,下载 LTS 版本的.安装时一路点确定,不要改动任何设置. 在 git-bash 或是 cmd 下,输入 n ...

  10. 20180105关于课题所用的labview的改进随笔

    在原有的工程上1.写入60个不同的数字~顶层,看测量次数是1.2.3.4.5.6.7.8.9的时候文件记到几次的数,一次的话,从接受命令到全部写到文件最短需要等多久.写入固定的数,通过startfla ...