获取异常信息_如何在 ASP.NET Core 中实现全局异常拦截

异常是一种运行时错误,当异常没有得到适当的处理,很可能会导致你的程序意外终止,这篇就来讨论一下如何在 ASP.Net Core MVC 中实现全局异常处理,我会用一些 样例代码 和 截图 来说明这些概念。

全局异常处理

其实在 ASP.Net Core MVC 框架中已经有了全局异常处理的机制,你可以在一个中心化的地方使用 全局异常处理中间件 来进行异常拦截,如果不用这种中心化方式的话,你就只能在 Controller 或者 Action 作用域上单独处理,这会导致异常处理代码零散在项目各处,不好维护也特别麻烦,不是吗?

第二种处理 全局异常 的做法就是使用 exception filter,在本篇中,我准备跟大家聊一聊 全局异常处理中间件UseExceptionHandler 方法来管控异常。

使用 UseExceptionHandler 扩展方法

UseExceptionHandler 扩展方法能够将 ExceptionHandler 中间件注册到 Asp.net Core 的 请求处理管道 中,然后在 IExceptionHandlerFeature 接口的实例中获取 异常对象,下面的代码片段展示了如何使用 UseExceptionHandler 方法来截获全局异常。

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)        {            app.UseExceptionHandler(builder =>             {                 builder.Run(async context =>                {                    context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;                    context.Response.ContentType = "application/json";                    var exception = context.Features.Get();                    if (exception != null)                    {                        var error = new ErrorMessage()                        {                            Stacktrace = exception.Error.StackTrace,                            Message = exception.Error.Message                        };                        var errObj = JsonConvert.SerializeObject(error);                        await context.Response.WriteAsync(errObj).ConfigureAwait(false);                    }                });             }         );            app.UseStaticFiles();            app.UseRouting();            app.UseAuthorization();            app.UseEndpoints(endpoints =>            {                endpoints.MapControllerRoute(                    name: "default",                    pattern: "{controller=Home}/{action=Index}/{id?}");            });        }

下面是代码中引用的 ErrorMessage 类的定义。

    public class ErrorMessage    {        public string Message { get; set; }        public string Stacktrace { get; set; }    }

配置 全局异常中间件

大家都知道,ASP.Net Core MVC 项目中都会有一个 Startup.cs 文件,可以在 Configure 方法下配置 全局异常拦截中间件 代码,如下所示:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)        {            if (env.IsDevelopment())            {                app.UseDeveloperExceptionPage();            }            else            {                app.UseExceptionHandler("/Error");            }            app.UseStaticFiles();            app.UseCookiePolicy();            app.UseMvc(routes =>            {                routes.MapRoute(                    name: "default",                    template:                    "{controller=Home}/{action=Index}/{id?}");            });        }

可以着重看一下上面的 app.UseExceptionHandler("/Error");,这里的 UseExceptionHandler 实现了 pipeline 注册,一旦应用程序出现了未处理异常,那么会自动将 用户 导向 /Error 页面。

你可以用 UseStatusCodePagesWithReExecute 扩展方法给 pipeline 添加一些状态码页面,这是什么意思呢? 其实也就是 http 500 导向 500 页面, http 404 导向 404 页面,下面的代码片段展示了修改后的 Configure 方法代码。

   public void Configure(IApplicationBuilder app, IHostingEnvironment env)   {            if (env.IsDevelopment())            {                app.UseDeveloperExceptionPage();            }            else            {                app.UseExceptionHandler("/Error");                app.UseStatusCodePagesWithReExecute("/Error/NotFound/{0}");            }            //Other code   }

使用 ErrorController

在 HomeController 下有一个专门处理错误的 action 方法,这里我们不使用这个 action,你可以把它删掉,接下来我准备定义一个专门的 ErrorController,里面包含了一个路由为 /Error 的 action 方法。

    public class ErrorController : Controller    {        [HttpGet("/Error")]        public IActionResult Index()        {            IExceptionHandlerPathFeature iExceptionHandlerFeature = HttpContext.Features.Get();            if (iExceptionHandlerFeature != null)            {                string path = iExceptionHandlerFeature.Path;                Exception exception = iExceptionHandlerFeature.Error;                //Write code here to log the exception details                return View("Error",iExceptionHandlerFeature);            }                            return View();        }        [HttpGet("/Error/NotFound/{statusCode}")]        public IActionResult NotFound(int statusCode)        {            var iStatusCodeReExecuteFeature =HttpContext.Features.Get();            return View("NotFound",iStatusCodeReExecuteFeature.OriginalPath);        }    }

你可以用 IExceptionHandlerPathFeature 来获取异常相关信息,也可以用 IStatusCodeReExecuteFeature 来获取 http 404 异常时当时的请求路径,对了,要想用上 IExceptionHandlerPathFeatureIStatusCodeReExecuteFeature,要记得在 nuget 上安装了 Microsoft.AspNetCore.Diagnostics 包,下面的代码展示了如何获取异常发生时刻的路由地址。

string route = iExceptionHandlerFeature.Path;

如果想获取异常的详细信息,可以使用如下语句。

var exception = HttpContext.Features.Get();

一旦获取了这个路由地址和异常的详细信息,就可以将它记录到你的日志文件中,可供后续仔细分析。

使用 View 展示错误信息

可以创建一个 View 来展示出现的错误信息,下面时 Error ViewPage 的详细代码。

@model Microsoft.AspNetCore.Diagnostics.IExceptionHandlerFeature@{    ViewData["Title"] = "Index";    Layout = "~/Views/Shared/_Layout.cshtml";}

Error: @Model.Error.Message

@Model.Error.StackTrace

@Model.Error.InnerException

下面是 NotFound 页面的 代码

@model string@{    ViewData["Title"] = "NotFound";    Layout = "~/Views/Shared/_Layout.cshtml";}    

Error: The requested URL @Model was not found!

现在可以把程序跑起来了,你会看到如下的错误信息。

8b15cd4ab4a0dc58e76275b84fedadba.png

如果你尝试打开一个不存在的页面, 会自动跳转到 ErrorController.NotFound 所包装的 404 描述信息。

e7f01107318ccba98f7ff8c495525a70.png

ASP.NET Core 中内置了 全局异常处理,你可以利用这项技术在一个集中化的地方去截获你应用程序中的所有异常信息,当然你也可以基于环境的不同采取不用的异常处理措施,比如说:开发环境,测试环境,生产环境 等等。

译文链接:https://www.infoworld.com/article/3435771/how-to-implement-global-exception-handling-in-aspnet-core-mvc.html

更多高质量干货:参见我的 GitHub: dotnetfly**

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399340.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop学习笔记—15.HBase框架学习(基础知识篇)

Hadoop学习笔记—15.HBase框架学习(基础知识篇) HBase是Apache Hadoop的数据库,能够对大型数据提供随机、实时的读写访问。HBase的目标是存储并处理大型的数据。HBase是一个开源的,分布式的,多版本的,面向列…

室内地图 - (资料收集)

基于HTML5 Canvas绘制的支持手势缩放的室内地图 https://blog.csdn.net/licaomengRICE/article/details/50116781 室内地图制作流程 https://wenku.baidu.com/view/5dd7d6ba960590c69fc37604.html 使用JOSM绘制室内地图及路径(一) https://blog.csdn.…

C#异常处理机制初步

原地址:http://www.sudu.cn/info/html/edu/net/20071227/50446.html 一、c#的异常处理所用到关键字 try 用于检查发生的异常,并帮助发送任何可能的异常。 catch 以控制权更大的方式处理错误,可以有多个catch子句。 finally 无论是…

scss常用(一)

charset "utf-8"; /* 页面中两边留下的空白 */ /* */ //间距 $generalMargin:2.86rem/2; $titleMargin:1.43rem/2; $moreBigMargin:4.29rem/2; $bigMargin:3.57rem/2; $smallMargin:2.14rem/2; $smallerMargin:1.5rem/2;/* *//* */ //尺寸 $bigFont:3.14rem/2; $m…

二维数组删除_「leetcode」数组:总结篇!(一文搞懂数组题目)

数组理论基础数组是非常基础的数据结构,在面试中,考察数组的题目一般在思维上都不难,主要是考察对代码的掌控能力也就是说,想法很简单,但实现起来 可能就不是那么回事了。首先要知道数组在内存中的存储方式&#xff0c…

TextView显示颜色高亮的问题

TextView textView (TextView) findViewById( R.id.tv );String text "<font color\"#d93b3a\">" "快过年了" "</font>" "<font color\"#666666\">" "哈哈哈哈" "</…

开源GIS解决方案,暨GeoServer+OpenLayer结合开发总结

http://linking123.github.io/2018/07/21/%E5%BC%80%E6%BA%90GIS%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%8C%E6%9A%A8GeoServer-OpenLayer%E7%BB%93%E5%90%88%E5%BC%80%E5%8F%91%E6%80%BB%E7%BB%93/ – 0.感叹 – 1.文档说明 – 2.文档内容 — 2.1 GeoServer - 地图服务 —…

TOJ---2621--全排列

这个方法 是超神教我的 --- 全排列的方法太多种了 感觉他这种写的 字典序法 是最简单的 最容易让人接受的 而且在时间复杂度和空间复杂度上 都可以让人接受 我待会将具体每步做法简要写一下...-> 我现在被一个 三角形给 深深烦死了 。。。。。。贴个代码 来 缓解下..... 1 …

Azure 和 Linux

Azure 正在不断集结各种集成的公有云服务&#xff0c;包括分析、虚拟机、数据库、移动、网络、存储和 Web&#xff0c;因此很适合用于托管解决方案。 Azure 提供可缩放的计算平台&#xff0c;允许即用即付&#xff0c;而无需投资购买本地硬件。 Azure 允许根据客户端所需的任何…

java获取classpath以外的路径

最近在使用以前写过的代码生成器&#xff08;从表名可生成所有的代码&#xff09;的时候&#xff0c;发现生成的文件都在classpath目录下&#xff0c;所有的文件都得自己拷到工程目录下&#xff0c;于是&#xff0c;想优化一下&#xff0c;取得classpath目录以外的路径&#xf…

月份第一天_4月份的第一天,全省迎来晴暖天气~

2019年4月1日早上好北方新农村准时准点播报~▼▼▼今天是2019年4月1日星期一辽宁的天气小孩的脸说变就变上周末突如其来的一场雪&#xff0c;让辽宁大部分地区“措手不及”已经开始回升的温度瞬间跌落到谷底。但不管怎样&#xff0c;随着节气的更迭&#xff0c;冷空气终究大势已…

Windows系统下搭建Git本地代码库

近由于工作需要&#xff0c;要把工作代码做一下版本管理。工作代码也不方便放到github上&#xff0c;也不想付费建私密库&#xff0c;公司也没几个人&#xff0c;所以就想着搭建一个本地Git版本库&#xff0c;来做版本管理。搭建过程如下。 系统环境&#xff1a;Dell OptiPlex…

mac 下终端 操作svn命令 以及出现证书错误的处理方法

首先&#xff0c;转载地址&#xff1a;http://hi.baidu.com/zhu410289616/item/eaaf160f60eb0dc62f4c6b0e 还有一个地址&#xff1a;http://www.cnblogs.com/heiniuhaha/archive/2011/11/11/2245594.html 解决证书出错&#xff0c;错误见下图&#xff1a; 解决方法&#xff1a;…

Linux shell multifile content replace with sed

#!/bin/bash# Linux shell multifile content replace with sed # 声明&#xff1a; # 本源代码主要是利用两份&#xff08;中、英文&#xff09;具有相同键值对的json数据&#xff0c;对html内的中文进行 # 自动化文本替换的代码。 # # …

jquery实时监听输入框值变化

在做web开发时候很多时候都需要即时监听输入框值的变化&#xff0c;以便作出即时动作去引导浏览者增强网站的用户体验感。而采用onchange时间又往往是在输入框失去焦点&#xff08;onblur&#xff09;时候触发&#xff0c;有时候并不能满足条件。 首先看一下dom中元素事件&…

文件过滤_jmeter(七)-BeanShell对数据过滤保存文件

在测试中有时需要对参数化数据进行过滤&#xff0c;实现保存到一个文件。如&#xff1a;某项目&#xff0c;从数据库查询到10万条用户数据&#xff0c;因为有的用户没有权限或者过期了&#xff0c;需要对这份数据筛选出来能正常使用的用户。如下使用beanshell实现此功能。原文件…

如何在mac系统下搭建git服务器

https://zhidao.baidu.com/question/1823748339128066228.html 第一步,下载gitblit http://gitblit.com/ 这里当然是选择linux/osx的版本。下载下来是一个.tar.gz的压缩文件&#xff0c;我下载时最新版本是gitblit-1.7.1.tar.gz 第二步&#xff0c;配置gitblit 创建目录&…

高级开发面试题

1.以前公司做过哪些项目&#xff1b; 2.这些项目都用到哪些技术&#xff1b; 3.redis里有哪些数据类型&#xff0c;对比memcache和redis&#xff1b; 4.目前平台的系统架构&#xff1b; 5.dubbo的server分了几个&#xff0c;怎么分的&#xff1b; 6.集群的负载策略&#xff1b;…

部品se分析_汽车储物箱部品模具,二色产品模具专业厂

汽车储物箱部品模具PVC塑料型材挤出模具是挤出生产线的核心部分&#xff0c;它包括口模(又称模头)、定型模、冷却水箱等。口模通过法兰盘与挤出机机头上的法兰盘组装在一起&#xff0c;安装加热圈、加热板&#xff0c;接通电源和热电偶。定型模和冷却水箱装用螺钉固定在定型台&…

WordPress二次开发经验简短总结

1.建议直接在客户给的服务器环境上安装WordPress程序再二次开发&#xff0c;如果在自己的开发机上安装好后再迁移过去&#xff0c;不同版本数据库或不同版本PHP环境可能会砸出坑。 2.由于国情原因&#xff0c;大陆访问googleapis.com呈现龟速特征&#xff0c;参考我之前的文章…