.NetCore——全域性異常過濾器ExceptionFilterAttribute

小學生—喬凡發表於2020-07-27

.NetCore——全域性異常過濾器ExceptionFilterAttribute

一、介紹
在我們的專案執行中,當程式出現異常的時候就會彈窗大黃頁,所以為了更方便的解決這個問題,我們採用全域性過濾器 ExceptionFilterAttribute 。通過它主動捕獲程式中的異常,然後經過處理再丟擲資訊。下面我們們直接上乾貨,擼起來。
二、使用
首先建立一個 MyExceptionFilter 繼承 ExceptionFilterAttribute 並重寫 OnException方法。在方法中寫自己處理邏輯,如圖
在這裡插入圖片描述

 public class MyExceptionFilter : ExceptionFilterAttribute
    {

        LoggerHelper _loggerHelper;

        public MyExceptionFilter(LoggerHelper loggerHelper)
        {
            _loggerHelper = loggerHelper;
        }

        public override void OnException(ExceptionContext context)
        {
            // 如果異常沒有被處理則進行處理
            if (context.ExceptionHandled == false)
            {
                //定義返回資訊
                Response res = new Response();
                res.Code = 500;
                res.Message = "發生錯誤,請聯絡管理員";

                //寫入日誌
                _loggerHelper.Error(context.HttpContext.Request.Path, context.Exception);

                context.Result = new ContentResult
                {
                    // 返回狀態碼設定為200,表示成功
                    StatusCode = StatusCodes.Status200OK,
                    // 設定返回格式
                    ContentType = "application/json;charset=utf-8",
                    Content = JsonConvert.SerializeObject(res)
                };
            }
            // 設定為true,表示異常已經被處理了
            context.ExceptionHandled = true;
        }
    }

下面在Startup的ConfigureServices方法中註冊,新增到全域性使用。如圖
在這裡插入圖片描述
這樣就算完成了。下面開始測試是否可以使用
在這裡插入圖片描述
再圖中可以看到我寫了一個GetTest的測試方法,並且new了一個異常,下面就看能不能捕獲異常。在異常過濾器的方法中我有一個寫入日誌的動作,且有返回資訊的處理。等呼叫完介面,看這兩個地方就知道我們們的過濾器是否好用了。
在這裡插入圖片描述
如圖所示,現在返回資訊是沒有問題的。下面看一下日誌中的記錄
在這裡插入圖片描述
通過日誌檔案的檢視,發現異常過濾器已經生效了。
三、總結
這就是全域性異常過濾器的簡單使用的全部了。
我用的環境是vs2019,.netCore3.1。
日誌使用的是Log4,通過.netcore的注入了一個實現類,進行日誌的記錄

相關文章