ASP.NET Core 中间件的使用(三):全局异常处理机制
前言
我们经常听到“秒修复秒上线”,觉得很厉害的样子。
其实不然,这只是一个调侃而已,出现问题的方式很多(逻辑漏洞、代码异常、操作方式不正确等)。
我们今天来说代码异常问题怎么快速定位,减少不必要的时间浪费。
这就是今天的主题“添加全局异常处理机制”捕捉异常存储到数据库(mongodb、SqlServer、MySQL等)。
PS:输出txt的话不怎么友好,不是所有人都能登录服务器的。
异常是一种运行时错误,当异常没有得到适当的处理,很可能会导致你的程序意外终止。
创建项目
我们创建一个ASP.NET Core Web API项目,选择.NET Core3.1。

创建全局异常过滤器
在控制器里面创建一个异常过滤器,命名为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 //下面是你的返回页面显示的内容提示,以下省略 }
}
}
依赖注入全局异常处理机制
在Startup.cs里面把我们刚刚创建的全局异常处理机制注入到中间件来,放到ConfigureServices方法里面。
//添加全局异常处理机制
services.AddMvc(option => {
option.Filters.Add<ExceptionFilter>();
});
// 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<ExceptionFilter>();
});
}
测试全局异常处理机制
“将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 Core 中间件的使用(一):搭建静态文件服务器/访问指定文件:https://www.cnblogs.com/xiongze520/p/14143581.html
- ASP.NET Core 中间件的使用(二):依赖注入的使用:https://www.cnblogs.com/xiongze520/p/14155858.html
参考文献
|
欢迎关注订阅微信公众号【熊泽有话说】,更多好玩易学知识等你来取
作者:熊泽-学习中的苦与乐 公众号:熊泽有话说 出处: https://www.cnblogs.com/xiongze520/p/15348130.html 您可以随意转载、摘录,但请在文章内注明作者和原文链接。 |

ASP.NET Core 中间件的使用(三):全局异常处理机制的更多相关文章
- ASP.NET Core 中间件自定义全局异常处理
目录 背景 ASP.NET Core过滤器(Filter) ASP.NET Core 中间件(Middleware) 自定义全局异常处理 .Net Core中使用ExceptionFilter .Ne ...
- ASP.NET Core 中间件 自定义全局异常中间件以及 MVC异常过滤器作用
中间件是一种装配到应用管道以处理请求和响应的软件. 每个组件: 选择是否将请求传递到管道中的下一个组件. 可在管道中的下一个组件前后执行工作. 请求委托用于生成请求管道. 请求委托处理每个 HTTP ...
- 如何一秒钟从头构建一个 ASP.NET Core 中间件
前言 其实地上本没有路,走的人多了,也便成了路. -- 鲁迅 就像上面鲁迅说的那样,其实在我们开发中间件的过程中,微软并没有制定一些策略或者文档来约束你如何编写一个中间件程序, 但是其中却存在者一些最 ...
- ASP.NET Core中间件实现分布式 Session
1. ASP.NET Core中间件详解 1.1. 中间件原理 1.1.1. 什么是中间件 1.1.2. 中间件执行过程 1.1.3. 中间件的配置 1.2. 依赖注入中间件 1.3. Cookies ...
- ASP.NET Core 入门教程 9、ASP.NET Core 中间件(Middleware)入门
一.前言 1.本教程主要内容 ASP.NET Core 中间件介绍 通过自定义 ASP.NET Core 中间件实现请求验签 2.本教程环境信息 软件/环境 说明 操作系统 Windows 10 SD ...
- Asp.net core中间件实现原理及用法解说
简述asp.net core中间件的实现思路 原文地址:https://www.cnblogs.com/shengyu-kmust/p/11583974.html 一次http请求的过程,就是对一个R ...
- ASP.NET Core中间件实现分布式 Session(转载)
ASP.NET Core中间件实现分布式 Session 1. ASP.NET Core中间件详解 1.1. 中间件原理 1.1.1. 什么是中间件 1.1.2. 中间件执行过程 1.1.3. 中间件 ...
- ASP.NET Core 入门笔记10,ASP.NET Core 中间件(Middleware)入门
一.前言 1.本教程主要内容 ASP.NET Core 中间件介绍 通过自定义 ASP.NET Core 中间件实现请求验签 2.本教程环境信息 软件/环境 说明 操作系统 Windows 10 SD ...
- ASP.NET Core 中间件的使用(二):依赖注入的使用
写在前面 上一篇大家已经粗略接触了解到.NET Core中间件的使用:ASP .Net Core 中间件的使用(一):搭建静态文件服务器/访问指定文件, .NET Core框架中很多核心对象都是通过依 ...
随机推荐
- HTML <form> 标签的 method 属性
定义和用法 method 属性规定如何发送表单数据(表单数据发送到 action 属性所规定的页面). 表单数据可以作为 URL 变量(method="get")或者 HTTP p ...
- 【java web】过滤器、拦截器、监听器的区别
一.对比: 1.1 过滤器和拦截器的区别: ①拦截器是基于java的反射机制的,而过滤器是基于函数回调. ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器. ③拦截器只能对actio ...
- C语言格式化输出语句
%d:带符号十进制整数 : %c:单个字符: %s:字符串: %f:6位小数:float; %.2f表示小数点后精确到两位 %lf:6位小数:double;
- 【SpringMVC】域对象共享数据
使用ModelAndView向request域对象共享数据 index.html <a th:href="@{/testModelAndView}">使用ModelAn ...
- IDEA第三方jar包引入的三种方法(专治IDEA2020.1.1的坑)
一: 二: 三:
- 阿里云服务器,http免费转https详细教程
1.搜ssl证书,点击立即购买 2.这里我们选择免费证书,点击右边立即购买,去支付 购买完成之后,申请证书状态会显示在审核中,不过很快的,几分钟就申请成功了,以下就是我申请成功的界面,因为我服务器用的 ...
- 24点游戏(24 game)的C++编程求解实现
什么是24点游戏 24点游戏,英文叫做24 game,是对给定的4个非负整数进行加减乘除运算,要求每个数都要被用到且仅用到一次,并得到最终的运算结果为24.比如3.8.3.8这四个数,可以找出唯一的一 ...
- cs_play
# -*-coding:utf-8-*-__author__ = "logan.xu"###构造函数#class Role:# n = 123# # 类变量 比如 n = 123# ...
- 紫色飞猪的研发之旅--06go自定义状态码
在实际开发中,需要前后端需要协商状态码,状态码用于后端返前端时使用.在一个团队中,定义的状态码讲道理应该是一致的,项目开始的起始阶段状态码应该是定义了个七七八八的,随着功能的叠加而不断增加.此系列将围 ...
- GetX代码生成IDEA插件,超详细功能讲解(透过现象看本质)
前言 本文章不是写getx框架的使用,而且其代码生成IDEA插件的功能讲解 我之前写过俩篇很长很长的getx文章 一篇入门使用:Flutter GetX使用---简洁的魅力! 一篇原理深度剖析:Flu ...