ASP.NET Core中实现全局异常拦截的完整步调

异常是一种运行时错误,当异常没有获得适当的处理惩罚,很大概会导致你的措施意外终止,这篇就来接头一下如安在 ASP.Net Core MVC 中实现全局异常处理惩罚,我会用一些 样例代码 和 截图 来说明这些观念。

全局异常处理惩罚

其实在 ASP.Net Core MVC 框架中已经有了全局异常处理惩罚的机制,你可以在一其中心化的处所利用 全局异常处理惩罚中间件 来举办异常拦截,假如不消这种中心化方法的话,你就只能在 Controller 可能 Action 浸染域上单独处理惩罚,这会导致异常处理惩罚代码零星在项目遍地,欠好维护也出格贫苦,不是吗?

第二种处理惩罚 全局异常 的做法就是利用 exception filter,在本篇中,我筹备跟各人聊一聊 全局异常处理惩罚中间件 和 UseExceptionHandler 要领来管控异常。

利用 UseExceptionHandler 扩展要领

UseExceptionHandler 扩展要领可以或许将 ExceptionHandler 中间件注册到 Asp.net Core 的 请求处理惩罚管道 中,然后在 IExceptionHandlerFeature 接口的实例中获取 异常工具,下面的代码片断展示了如何利用 UseExceptionHandler 要领来截获全局异常。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseExceptionHandler(builder => { builder.Run(async context => { context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; context.Response.ContentType = "application/json"; var exception = context.Features.Get<IExceptionHandlerFeature>(); if (exception != null) { var error = new ErrorMessage() { Stacktrace = exception.Error.StackTrace, Message = exception.Error.Message }; var errObj = JsonConvert.SerializeObject(error); await context.Response.WriteAsync(errObj).ConfigureAwait(false); } }); } ); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }

下面是代码中引用的 ErrorMessage 类的界说。

public class ErrorMessage { public string Message { get; set; } public string Stacktrace { get; set; } }

设置 全局异常中间件

各人都知道,ASP.Net Core MVC 项目中城市有一个 Startup.cs 文件,可以在 Configure 要领下设置 全局异常拦截中间件 代码,如下所示:

public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); } app.UseStaticFiles(); app.UseCookiePolicy(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }

可以着重看一下上面的 app.UseExceptionHandler("/Error"); ,这里的 UseExceptionHandler 实现了 pipeline 注册,一旦应用措施呈现了未处理惩罚异常,那么会自动将 用户 导向 /Error 页面。

你可以用 UseStatusCodePagesWithReExecute 扩展要领给 pipeline 添加一些状态码页面,这是什么意思呢? 其实也就是 http 500 导向 500 页面, http 404 导向 404 页面,下面的代码片断展示了修改后的 Configure 要领代码。

public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); app.UseStatusCodePagesWithReExecute("/Error/NotFound/{0}"); } //Other code }

利用 ErrorController

在 HomeController 下有一个专门处理惩罚错误的 action 要领,这里我们不利用这个 action,你可以把它删掉,接下来我筹备界说一个专门的 ErrorController,内里包括了一个路由为 /Error 的 action 要领。

public class ErrorController : Controller { [HttpGet("/Error")] public IActionResult Index() { IExceptionHandlerPathFeature iExceptionHandlerFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>(); if (iExceptionHandlerFeature != null) { string path = iExceptionHandlerFeature.Path; Exception exception = iExceptionHandlerFeature.Error; //Write code here to log the exception details return View("Error",iExceptionHandlerFeature); } return View(); } [HttpGet("/Error/NotFound/{statusCode}")] public IActionResult NotFound(int statusCode) { var iStatusCodeReExecuteFeature =HttpContext.Features.Get<IStatusCodeReExecuteFeature>(); return View("NotFound",iStatusCodeReExecuteFeature.OriginalPath); } }

你可以用 IExceptionHandlerPathFeature 来获取异常相关信息,也可以用 IStatusCodeReExecuteFeature 来获取 http 404 异常时其时的请求路径,对了,要想用上 IExceptionHandlerPathFeature 和 IStatusCodeReExecuteFeature ,要记得在 nuget 上安装了 Microsoft.AspNetCore.Diagnostics 包,下面的代码展示了如何获取异常产生时刻的路由地点。

string route = iExceptionHandlerFeature.Path;

假如想获取异常的具体信息,可以利用如下语句。

var exception = HttpContext.Features.Get<IExceptionHandlerPathFeature>();

一旦获取了这个路由地点和异常的具体信息,就可以将它记录到你的日志文件中,可供后续仔细阐明。

利用 View 展示错误信息

可以建设一个 View 来展示呈现的错误信息,下面时 Error ViewPage 的具体代码。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsdxyp.html