目录

前言:

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

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

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

这就是今天的主题“添加全局异常处理机制”捕捉异常存储到数据库(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 全局异常处理机制内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!