ASP.NET Core 中间件的使用之全局异常处理机制

 更新时间:2021-11-14 13:50:52   作者:佚名   我要评论(0)

目录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异常上下文,其中包含了具体的异常信息,HttpContextmvc路由信息。

系统一旦出现未捕获异常后,比较常见的做法就是使用日志工具,将异常的详细信息记录下来,方便修正调试。

下面是日志记录的实现:

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<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>();
            });
        }
            

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 Core 中间件的使用之全局异常处理机制的文章就介绍到这了,更多相关ASP.NET Core 全局异常处理机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
  • asp.net core 集成swagger ui的原理解析
  • ASP.NET Core MVC 依赖注入View与Controller
  • ASP.NET Core MVC 过滤器(Filter)
  • ASP.NET Core MVC 修改视图的默认路径及其实现原理解析
  • ASP.NET Core Web API 教程Project Configuration
  • 在 ASP.NET Core 中自动启用 CAP 事务详情

相关文章

  • ASP.NET Core 中间件的使用之全局异常处理机制

    ASP.NET Core 中间件的使用之全局异常处理机制

    目录1、创建项目2、创建全局异常过滤器3、依赖注入全局异常处理机制4、测试全局异常处理机制前言: 我们经常听到“秒修复秒上线”,觉得很
    2021-11-14
  • 解析Pytorch中的torch.gather()函数

    解析Pytorch中的torch.gather()函数

    参数说明 以官方说明为例,gather()函数需要三个参数,输入input,维度dim,以及索引index input必须为Tensor类型 dim为int类型,代表从哪个
    2021-11-14
  • 93充100,电费充值系统怎么做到的

    93充100,电费充值系统怎么做到的

    CPS的本质就是销售;你卖出货就赚钱。 在生活中话费水费电费充值是刚需,基本上每个月都有需求。电费充值不同于话费,电费的市场更大。
    2021-11-09
  • 月入过万 外卖小程序你知道怎么做吗

    月入过万 外卖小程序你知道怎么做吗

    怎么赚钱 美团外卖饿了么外卖赚钱小程序还能赚钱吗,老有人问能不能赚钱,那么今天就说一下逻辑 首先,分为cps悬赏和,赏金两种方式赏金属于打赏比较高的。cps的模式主要靠用户下单的结算金额,用户买的多你就赚的多,通常是在3~6%,美团是3,美团被制裁之后就降价了(可能是这个原因,据说预算不够了)。
    2021-11-08
  • 外卖CPS返利小程序源码分享

    外卖CPS返利小程序源码分享

    怎么赚钱         美团外卖饿了么外卖赚钱小程序还能赚钱吗,老有人问能不能赚钱,那么今天就说一下逻辑 首先,分为cps悬赏和,赏金两种方式赏金属于打赏比较高的。cps的模式主要靠用户下单的结算金额,用户买的多你就赚的多,通常是在3~6%,美团是3,美团被制裁之后就降价了(可能是这个原因,据说预算不够了)。  当然了,依赖外卖cps赚钱是不行的,当然要加点东西了。比如涵盖话费、视频会员、加油卡、礼品卡等多种品类折扣权益,吃、喝、玩、乐、购
    2021-11-08
  • 淘客从简单发单到精推社群,单群收益5000+的经验分享

    淘客从简单发单到精推社群,单群收益5000+的经验分享

    作为淘宝客,看到下面的这个聊天记录,应该是有点羡慕的。社群里多几个这样的粉丝,可能自己的收入也蹭蹭蹭上涨了。今天,我们就为大家邀请了运营这个社群的淘宝客–淘宝联
    2021-11-06
  • 怎样申请抖音团长(详细教程)

    怎样申请抖音团长(详细教程)

    微客云 http://www.wikeyun.cn/在说怎样申请抖音团长之前,我简单聊聊我现在对抖音团长的基础认知,先截一张图,这是抖音团长后台的近30天排名截图,是对外公开的。这个图可
    2021-11-06
  • 一个新手如何做直播?主播有哪些聊天技巧?

    一个新手如何做直播?主播有哪些聊天技巧?

    除了多笑,新手主播也要考虑更多丰富的表情和动作:比如适当的剪刀手卖萌,手比爱心的温馨,吐舌头的调皮。介绍产品中途也可以唱唱歌,增加一些灵动的小手势和表情,这会让
    2021-11-06
  • 一个新手如何做直播?主播有哪些聊天技巧?

    一个新手如何做直播?主播有哪些聊天技巧?

    除了多笑,新手主播也要考虑更多丰富的表情和动作:比如适当的剪刀手卖萌,手比爱心的温馨,吐舌头的调皮。介绍产品中途也可以唱唱歌,增加一些灵动的小手势和表情,这会让
    2021-11-06
  • 微客云话费充值系统,可提供充值API接口

    微客云话费充值系统,可提供充值API接口

    微客云提供话费充值系统,电费充值系统,油卡充值系统等等生活缴费系统微客云地址:http://www.wikeyun.cn/话费充值接口文档接口版本:1.0 ―、引言1.1 文档概述本文档提供
    2021-11-06

最新评论