asp.net?core?MVC?全局過濾器之ExceptionFilter過濾器(1)
簡介
異常過濾器,顧名思義,就是當(dāng)程序發(fā)生異常時所使用的過濾器。用于在系統(tǒng)出現(xiàn)未捕獲異常時的處理。
實現(xiàn)一個自定義異常過濾器
自定義一個全局異常過濾器需要實現(xiàn)IExceptionFilter接口
public class HttpGlobalExceptionFilter : IExceptionFilter { public void OnException(ExceptionContext context) { throw new NotImplementedException(); } }
IExceptionFilter接口會要求實現(xiàn)OnException方法,當(dāng)系統(tǒng)發(fā)生未捕獲異常時就會觸發(fā)這個方法。OnException方法有一個ExceptionContext異常上下文,其中包含了具體的異常信息,HttpContext及mvc路由信息。系統(tǒng)一旦出現(xiàn)未捕獲異常后,比較常見的做法就是使用日志工具,將異常的詳細(xì)信息記錄下來,方便修正調(diào)試。下面是日志記錄的實現(xiàn)。
/// <summary> /// 全局異常過濾器 /// </summary> public class HttpGlobalExceptionFilter : IExceptionFilter { readonly ILoggerFactory _loggerFactory; readonly IHostingEnvironment _env; public HttpGlobalExceptionFilter(ILoggerFactory loggerFactory, IHostingEnvironment env) { _loggerFactory = loggerFactory; _env = env; } public void OnException(ExceptionContext context) { var logger = _loggerFactory.CreateLogger(context.Exception.TargetSite.ReflectedType); logger.LogError(new EventId(context.Exception.HResult), context.Exception, context.Exception.Message); var json = new ErrorResponse("未知錯誤,請重試"); if (_env.IsDevelopment()) json.DeveloperMessage = context.Exception; context.Result = new ApplicationErrorResult(json); context.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; context.ExceptionHandled = true; } public class ApplicationErrorResult : ObjectResult { public ApplicationErrorResult(object value) : base(value) { StatusCode = (int)HttpStatusCode.InternalServerError; } } public class ErrorResponse { public ErrorResponse(string msg) { Message = msg; } public string Message { get; set; } public object DeveloperMessage { get; set; } }
注冊全局過濾器
過濾器已經(jīng)編寫完畢,接下來就需要在asp.net core MVC中注冊。找到系統(tǒng)根目錄Startup.cs文件,修改ConfigureServices方法如下
services.AddMvc(options => { options.Filters.Add<HttpGlobalExceptionFilter>(); });
測試
在請求中拋出一個異常
日志正確捕獲到異常信息
瀏覽器返回500錯誤,并且返回自定義的錯誤信息。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解如何在ASP.NET Core Web API中以三種方式返回數(shù)據(jù)
這篇文章主要介紹了詳解如何在ASP.NET Core Web API中以三種方式返回數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01ASP.NET調(diào)用javascript腳本的常見方法小結(jié)
ASP.NET本身就提供了多種調(diào)用javascript腳本的方法,本文總結(jié)了六種調(diào)用方法,大家根據(jù)自己的使用習(xí)慣可以選擇相應(yīng)的調(diào)用方式了!2009-12-12使用.NET?6開發(fā)TodoList應(yīng)用之引入數(shù)據(jù)存儲的思路詳解
在這篇文章中,我們僅討論如何實現(xiàn)數(shù)據(jù)存儲基礎(chǔ)設(shè)施的引入,具體的實體定義和操作后面專門來說。對.NET?6開發(fā)TodoList引入數(shù)據(jù)存儲相關(guān)知識感興趣的朋友一起看看吧2021-12-12ASP.NET之Excel下載模板、導(dǎo)入、導(dǎo)出操作
這篇文章主要介紹了ASP.NET之Excel下載模板、導(dǎo)入、導(dǎo)出操作的相關(guān)資料,需要的朋友可以參考下2016-07-07ASP.NET MVC中將控制器分離到類庫的實現(xiàn)
這篇文章主要介紹了ASP.NET MVC中將控制器分離到類庫的實現(xiàn)的相關(guān)資料,需要的朋友可以參考下2015-06-06