前言

我们经常听到“秒修复秒上线”,觉得很厉害的样子。

其实不然,这只是一个调侃而已,出现问题的方式很多(逻辑漏洞、代码异常、操作方式不正确等)。

我们今天来说代码异常问题怎么快速定位,减少不必要的时间浪费。

这就是今天的主题“添加全局异常处理机制”捕捉异常存储到数据库(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.(输入字符串的格式不正确。)

下面是控制器方法截图


推荐资料

参考文献

 
欢迎关注订阅微信公众号【熊泽有话说】,更多好玩易学知识等你来取

作者:熊泽-学习中的苦与乐
公众号:熊泽有话说


出处: https://www.cnblogs.com/xiongze520/p/15348130.html



您可以随意转载、摘录,但请在文章内注明作者和原文链接。

ASP.NET Core 中间件的使用(三):全局异常处理机制的更多相关文章

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

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

  2. ASP.NET Core 中间件 自定义全局异常中间件以及 MVC异常过滤器作用

    中间件是一种装配到应用管道以处理请求和响应的软件. 每个组件: 选择是否将请求传递到管道中的下一个组件. 可在管道中的下一个组件前后执行工作. 请求委托用于生成请求管道. 请求委托处理每个 HTTP ...

  3. 如何一秒钟从头构建一个 ASP.NET Core 中间件

    前言 其实地上本没有路,走的人多了,也便成了路. -- 鲁迅 就像上面鲁迅说的那样,其实在我们开发中间件的过程中,微软并没有制定一些策略或者文档来约束你如何编写一个中间件程序, 但是其中却存在者一些最 ...

  4. ASP.NET Core中间件实现分布式 Session

    1. ASP.NET Core中间件详解 1.1. 中间件原理 1.1.1. 什么是中间件 1.1.2. 中间件执行过程 1.1.3. 中间件的配置 1.2. 依赖注入中间件 1.3. Cookies ...

  5. ASP.NET Core 入门教程 9、ASP.NET Core 中间件(Middleware)入门

    一.前言 1.本教程主要内容 ASP.NET Core 中间件介绍 通过自定义 ASP.NET Core 中间件实现请求验签 2.本教程环境信息 软件/环境 说明 操作系统 Windows 10 SD ...

  6. Asp.net core中间件实现原理及用法解说

    简述asp.net core中间件的实现思路 原文地址:https://www.cnblogs.com/shengyu-kmust/p/11583974.html 一次http请求的过程,就是对一个R ...

  7. ASP.NET Core中间件实现分布式 Session(转载)

    ASP.NET Core中间件实现分布式 Session 1. ASP.NET Core中间件详解 1.1. 中间件原理 1.1.1. 什么是中间件 1.1.2. 中间件执行过程 1.1.3. 中间件 ...

  8. ASP.NET Core 入门笔记10,ASP.NET Core 中间件(Middleware)入门

    一.前言 1.本教程主要内容 ASP.NET Core 中间件介绍 通过自定义 ASP.NET Core 中间件实现请求验签 2.本教程环境信息 软件/环境 说明 操作系统 Windows 10 SD ...

  9. ASP.NET Core 中间件的使用(二):依赖注入的使用

    写在前面 上一篇大家已经粗略接触了解到.NET Core中间件的使用:ASP .Net Core 中间件的使用(一):搭建静态文件服务器/访问指定文件, .NET Core框架中很多核心对象都是通过依 ...

随机推荐

  1. 狂神说SpringBoot02:运行原理初探

    狂神说SpringBoot系列连载课程,通俗易懂,基于SpringBoot2.2.5版本,欢迎各位狂粉转发关注学习. 微信公众号:狂神说(首发)    Bilibili:狂神说Java(视频) 未经作 ...

  2. 1 TortoiseGit简介

    tortoiseGit是一个开放的git版本控制系统的源客户端,支持Winxp/vista/win7.该软件功能和git一样 不同的是:git是命令行操作模式,tortoiseGit界面化操作模式,不 ...

  3. SpringBoot快速搭建流程

    创建一个新项目 使用maven创建一个新项目 给定项目名称.finsh完成创建 跑起来SpringBoot 引入依赖parent > SpringBoot父级依赖,spring-boot-sta ...

  4. Java finally语句到底是在return之前还是之后执行

    看过网上关于Java中异常捕获机制try-catch-finally块中的finally语句是不是一定会被执行的讨论也有很多. 首先明确一点,下面两种情况finally肯定是不执行的: 1). ret ...

  5. 关于mysql的备份和恢复

    备份:在登录之前(cmd中)mysqldump -u root -p [数据库名称] > c:/back.sql备份的话,肯定是DBA才能做,所以只能用root:恢复mysql -u root ...

  6. eval()函数的使用

    1.eval() 函数作用:可以接受一个字符串str作为参数,并把这个参数作为脚本代码来 执行. 2.参数情况:(1)如果参数是一个表达式,eval() 函数将执行表达式: (2) 如果参数是Java ...

  7. eslint and stylelint config

    eslint: module.exports = {   root: true,   env: {     browser: true,     es6: true,     node: true   ...

  8. JavaScript高级程序设计读书笔记之JSON

    JSON(JavaScript Object Notation)JavaScript对象表示法.JSON是JavaScript的一个严格的子集,利用了JavaScript中的一些模式来表示结构化数据. ...

  9. 使用 IDEA 配合 Dockerfile 部署 SpringBoot 工程

    准备 SpringBoot 工程 新建 SpringBoot 项目,默认的端口是 8080 ,新建 Controller 和 Mapping @RestController public class ...

  10. 为什么Class实例可以不是全局唯一的——自定义类加载器

    为什么Class实例可以不是全局唯一的 通过定义两个类加载器加载同一字节码文件来证明Class实例为什么不是全局唯一的 1.将一个名为Demo(没有后缀)的字节码文件放在D盘根目录 2.定义两个类加载 ...