ASP.NET|ASP.NET Core 中间件的使用之全局异常处理机制
目录
- 1、创建项目
- 2、创建全局异常过滤器
- 3、依赖注入全局异常处理机制
- 4、测试全局异常处理机制
我们经常听到“秒修复秒上线”,觉得很厉害的样子。
其实不然,这只是一个调侃而已,出现问题的方式很多(逻辑漏洞、代码异常、操作方式不正确等)。
我们今天来说代码异常问题怎么快速定位,减少不必要的时间浪费。
这就是今天的主题“添加全局异常处理机制”捕捉异常存储到数据库(mongodb、SqlServer、MySQL等)。
PS:输出txt的话不怎么友好,不是所有人都能登录服务器的。
异常是一种运行时错误,当异常没有得到适当的处理,很可能会导致你的程序意外终止。
1、创建项目 我们创建一个
ASP.NET Core Web API
项目,选择.NET Core3.1
。文章图片
2、创建全局异常过滤器 在控制器里面创建一个异常过滤器,命名为
ExceptionFilter.cs
,过滤器继承IExceptionFilter
接口。注意,我这里入库用的是
efcore+sqlserver
,大家可以根据自己实际情况使用ORM
和数据库方式。异常过滤器,顾名思义,就是当程序发生异常时所使用的过滤器。用于在系统出现未捕获异常时的处理。
实现一个自定义异常过滤器,自定义一个全局异常过滤器需要实现
IExceptionFilter
接口。IExceptionFilter
接口会要求实现OnException
方法,当系统发生未捕获异常时就会触发这个方法。OnException方法有一个
ExceptionContext
异常上下文,其中包含了具体的异常信息,HttpContext
及mvc
路由信息。系统一旦出现未捕获异常后,比较常见的做法就是使用日志工具,将异常的详细信息记录下来,方便修正调试。
下面是日志记录的实现:
using Microsoft.AspNetCore.Mvc.Filters; using System; namespace Log4NetWebAPI.Controllers{public class ExceptionFilter: IExceptionFilter{//全局异常处理机制public void OnException(ExceptionContext context){Exception ex = context.Exception; //错误所在的控制器方法名称var DisplayName = context.ActionDescriptor.DisplayName; #region 错误所在的行号行号////行号前的名称有的是中文,有的是英文,注意甄别//var aaa = ex.StackTrace.Substring(ex.StackTrace.IndexOf("行号"), ex.StackTrace.Length - ex.StackTrace.IndexOf("行号")); //var ccc = ex.StackTrace.Substring(ex.StackTrace.IndexOf("line"), ex.StackTrace.Length - ex.StackTrace.IndexOf("line")); var lineNumber = 0; const string lineSearch = ":line "; var index = ex.StackTrace.LastIndexOf(lineSearch); if (index != -1){var lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length); var lineNumberStr = lineNumberText.Substring(0, lineNumberText.IndexOf("\r\n")); if (int.TryParse(lineNumberStr, out lineNumber)){}}#endregion#region 写入信息到【数据库】,这里自行入库即可(mongodb、SqlServer、MySQL等),我以SqlServer为例errorLog md = new errorLog(); md.logTime = DateTime.Now; md.logType = "error"; md.displayName = DisplayName; //错误位置md.lineNumber = lineNumber; //错误行号md.message = ex.Message; //错误信息md.messagedetails = ex.ToString(); //错误详情md.createTime= DateTime.Now; using (var ctx = new dbContext()){ctx.Add(md); ctx.SaveChanges(); }#endregion//下面是你的返回页面显示的内容提示,以下省略}}}
3、依赖注入全局异常处理机制 在
Startup.cs
里面把我们刚刚创建的全局异常处理机制注入到中间件来,放到ConfigureServices
方法里面。//添加全局异常处理机制
services.AddMvc(option => {
option.Filters.Add();
});
// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services){services.AddControllers(); //添加全局异常处理机制services.AddMvc(option => {option.Filters.Add(); }); }
4、测试全局异常处理机制 “将
string
字符串转换为int类型”,如下代码,肯定是报错的,我们来捕捉一下错误信息入库。var numberNo = "我是序列号";运行项目后我们查询一下数据库,发现捕捉到错误信息了,包括
//这里是转换为int类型,然后数据源是string,肯定报错,然后我们全局捕捉
//注意,我们这里没有写try catch
var number = Convert.ToInt32(numberNo);
错误时间:2021-09-28 15:12:58.307
日志类型:error
错误的方法位置:Log4NetWebAPI.Controllers.WeatherForecastController.Get (Log4NetWebAPI),
错误的行号:36行,
错误的信息:Input string was not in a correct format.(输入字符串的格式不正确。)
文章图片
下面是控制器方法截图
文章图片
文章图片
【ASP.NET|ASP.NET Core 中间件的使用之全局异常处理机制】到此这篇关于
ASP.NET Core
中间件的使用之全局异常处理机制的文章就介绍到这了,更多相关ASP.NET Core
全局异常处理机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!推荐阅读
- 关于Core|关于Core Image
- ASP.NET|ASP.NET Core应用开发思维导图
- Java消息中间件概念基础
- 运行报错Cannot|运行报错Cannot find module '@babel/compat-data/corejs3-shipped-proposals’
- MetaQ原理简介(一)
- 基于NET|基于NET Core 的Nuget包制作、发布和运用流程解析(完整过程)
- 云栖号技术分享|一年增加 1.2w 星,Dapr 能否引领云原生中间件的未来()
- 3.UIkit|3.UIkit CoreFoundatin Foundation
- asp.net|asp.net core中使用log4net
- Asp.net|System.Globalization.DateTimeFormatInfo.InvariantInfo