最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ASP.NET Core 中間件的使用之全局異常處理機制

 更新時間:2021年09月29日 17:24:00   作者:熊澤-學(xué)習(xí)中的苦與樂  
我們今天這篇文章就來說說代碼異常問題怎么快速定位,減少不必要的時間浪費。異常是一種運行時錯誤,當(dāng)異常沒有得到適當(dāng)?shù)奶幚?,很可能會?dǎo)致你的程序意外終止。下面雄安邊將詳細介紹,需要的朋友可以參考下

前言:

我們經(jīng)常聽到“秒修復(fù)秒上線”,覺得很厲害的樣子。

其實不然,這只是一個調(diào)侃而已,出現(xiàn)問題的方式很多(邏輯漏洞、代碼異常、操作方式不正確等)。

我們今天來說代碼異常問題怎么快速定位,減少不必要的時間浪費。

這就是今天的主題“添加全局異常處理機制”捕捉異常存儲到數(shù)據(jù)庫(mongodb、SqlServer、MySQL等)。

PS:輸出txt的話不怎么友好,不是所有人都能登錄服務(wù)器的。

異常是一種運行時錯誤,當(dāng)異常沒有得到適當(dāng)?shù)奶幚?,很可能會?dǎo)致你的程序意外終止。

1、創(chuàng)建項目

我們創(chuàng)建一個ASP.NET Core Web API項目,選擇.NET Core3.1。

2、創(chuàng)建全局異常過濾器

在控制器里面創(chuàng)建一個異常過濾器,命名為ExceptionFilter.cs,過濾器繼承IExceptionFilter接口。

注意,我這里入庫用的是efcore+sqlserver,大家可以根據(jù)自己實際情況使用ORM和數(shù)據(jù)庫方式。

 異常過濾器,顧名思義,就是當(dāng)程序發(fā)生異常時所使用的過濾器。用于在系統(tǒng)出現(xiàn)未捕獲異常時的處理。

實現(xiàn)一個自定義異常過濾器,自定義一個全局異常過濾器需要實現(xiàn)IExceptionFilter接口。

 IExceptionFilter接口會要求實現(xiàn)OnException方法,當(dāng)系統(tǒng)發(fā)生未捕獲異常時就會觸發(fā)這個方法。

OnException方法有一個ExceptionContext異常上下文,其中包含了具體的異常信息,HttpContextmvc路由信息。

系統(tǒng)一旦出現(xiàn)未捕獲異常后,比較常見的做法就是使用日志工具,將異常的詳細信息記錄下來,方便修正調(diào)試。

下面是日志記錄的實現(xiàn):

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 寫入信息到【數(shù)據(jù)庫】,這里自行入庫即可(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

            //下面是你的返回頁面顯示的內(nèi)容提示,以下省略

        }
    }
}

3、依賴注入全局異常處理機制

Startup.cs里面把我們剛剛創(chuàng)建的全局異常處理機制注入到中間件來,放到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字符串轉(zhuǎn)換為int類型”,如下代碼,肯定是報錯的,我們來捕捉一下錯誤信息入庫。

var numberNo = "我是序列號";
//這里是轉(zhuǎn)換為int類型,然后數(shù)據(jù)源是string,肯定報錯,然后我們?nèi)植蹲?br /> //注意,我們這里沒有寫try catch
var number = Convert.ToInt32(numberNo);

運行項目后我們查詢一下數(shù)據(jù)庫,發(fā)現(xiàn)捕捉到錯誤信息了,包括

錯誤時間:2021-09-28 15:12:58.307

日志類型:error

錯誤的方法位置:Log4NetWebAPI.Controllers.WeatherForecastController.Get (Log4NetWebAPI),

錯誤的行號:36行,

錯誤的信息:Input string was not in a correct format.(輸入字符串的格式不正確。)

下面是控制器方法截圖

到此這篇關(guān)于ASP.NET Core 中間件的使用之全局異常處理機制的文章就介紹到這了,更多相關(guān)ASP.NET Core 全局異常處理機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • ASP.NET?Core使用Middleware設(shè)置有條件允許訪問路由

    ASP.NET?Core使用Middleware設(shè)置有條件允許訪問路由

    這篇文章主要介紹了ASP.NET?Core使用Middleware設(shè)置有條件允許訪問路由,文章圍繞主題相關(guān)資料展開學(xué)習(xí)內(nèi)容,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助
    2022-02-02
  • 簡單實現(xiàn).NET?Hook與事件模擬實例

    簡單實現(xiàn).NET?Hook與事件模擬實例

    這篇文章主要為大家介紹了簡單實現(xiàn).NET?Hook與事件模擬實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • .NET 6新特性試用Timer類之PeriodicTimer?

    .NET 6新特性試用Timer類之PeriodicTimer?

    這篇文章主要介紹了.NET 6新特性試用Timer類之PeriodicTimer,PeriodicTimer與其他Timer需要創(chuàng)建事件回調(diào)不同,下,下面文章詳細介紹PeriodicTimer的使用方式,需要的朋友可以參考一下
    2022-02-02
  • .NET?Core?中對象池?Object?Pool的使用

    .NET?Core?中對象池?Object?Pool的使用

    這篇文章主要介紹了?.NET?Core?中對象池?Object?Pool的使用,對象池簡單來說就是一種為對象提供可復(fù)用能力的軟件設(shè)計思路,對象池最常用的場景是游戲設(shè)計,因為在游戲中大量存在著可復(fù)用的對象,源源不斷的子彈出現(xiàn)并不是循環(huán)再生的,下面一起進入文章了解具體內(nèi)容吧
    2021-11-11
  • .Net Core HttpClient處理響應(yīng)壓縮詳細

    .Net Core HttpClient處理響應(yīng)壓縮詳細

    .Net Core作為后起之秀直接將HttpClient扶正,并且在此基礎(chǔ)上改良了HttpClientFactory,接下來我們就來探究一下在.Net Core中使用HttpClient處理響應(yīng)壓縮的機制。,需要的朋友可以參考下面文章的具體內(nèi)容
    2021-09-09
  • 使用Asp.net Mvc3 Razor視圖方式擴展JQuery UI Widgets方法介紹

    使用Asp.net Mvc3 Razor視圖方式擴展JQuery UI Widgets方法介紹

    jquery easyui grid或者extjs grid,jtable的代碼非常簡潔、對于grid功能要求不是很復(fù)雜的情況下,強烈推薦大家使用
    2012-11-11
  • .net中線程同步的典型場景和問題剖析

    .net中線程同步的典型場景和問題剖析

    在使用多線程進行編程時,有一些經(jīng)典的線程同步問題,對于這些問題,.net提供了多種不同的類來解決
    2012-11-11
  • ASP.NET熱點問題解答14個

    ASP.NET熱點問題解答14個

    ASP.NET熱點問題解答14個...
    2006-07-07
  • Net內(nèi)存管理五大基礎(chǔ)

    Net內(nèi)存管理五大基礎(chǔ)

    這篇文章主要給大家分享Net內(nèi)存管理五大基礎(chǔ)內(nèi)容,文章講圍繞Net內(nèi)存管理詳細介紹文章內(nèi)容,感興趣的朋友可以參考一下,希望對你有所幫助
    2021-10-10
  • 深入分析XmlSerializer對象的Xml序列化與反序列化的示例詳解

    深入分析XmlSerializer對象的Xml序列化與反序列化的示例詳解

    本篇文章是對XmlSerializer 對象的Xml序列化與反序列化的應(yīng)用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05

最新評論

南投县| 浦江县| 天等县| 犍为县| 阿坝县| 云梦县| 辰溪县| 奉新县| 平定县| 延吉市| 凤山市| 静海县| 乌拉特后旗| 新宁县| 曲沃县| 南江县| 隆林| 二连浩特市| 牡丹江市| 宜昌市| 修水县| 新平| 银川市| 林芝县| 信丰县| 玉溪市| 盐城市| 仙桃市| 庄浪县| 桑日县| 青田县| 翁源县| 平潭县| 巨野县| 庆安县| 杭锦旗| 嘉荫县| 都匀市| 桃园县| 黔南| 富蕴县|