ASP.NET Core 中的全局异常处理

Author Image
admin Tuesday, November 17, 2020 阅读数: 40
Share:

本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP)
本文出自《从零开始学 ASP.NET Core 与 EntityFramework Core》目录
视频课程效果更佳:跨平台开发实战掌握 ASP.NET Core 与 EntityFramework Core

ASP.NET Core 中的全局异常处理

在本章节中,我们将学习如何在 ASP.NET Core MVC 中 实现全局异常处理程序。

抛出异常

请参考 HomeController 中的以下 Details 操作方法。我们故意使用 throw 关键字抛出异常。

public ViewResult Details(int? id)
{
    throw new Exception("在Details视图中抛出异常");

   //其他代码
}

ASP.NET Core 中的 UseDeveloperExceptionPage 中间件

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    //其他代码
}

我们之前已经在开发环境中将 DeveloperExceptionPage 中间件配置到 HTTP 请求处理管道中 ,因此,如果我们在开发环境中运行应用程序,那么如果存在未处理的异常,我们会看到以下开发人员异常页面。 60-1

关于 异常中间件,我们在之前的章节有讲过。

DeveloperExceptionPage 中间件只能在开发环境中使用。例如,在像 Production 这样的非开发环境中使用此页面存在安全风险,因为它包含可供攻击者使用的详细异常信息。而且此异常页面对最终用户也没有任何意义。

ASP.NET Core 中非开发环境异常信息

本地开发机器上模拟在生产环境中运行应用程序将 launchSettings.json 中的 ASPNETCORE_ENVIRONMENT 变量设置为 Production。

"ASPNETCORE_ENVIRONMENT": "Production"

默认情况下,如果在生产等非开发环境中存在未处理的异常,我们会看到以下默认页面。

60-2

请注意,上图中除了显示有 个 http 500 错误之外,我们没有看到任何其他信息。错误 500 表示服务器上出现错误,服务器不知道如何处理。

此默认页面对最终用户不是很有用。我们希望处理异常并将用户重定向到自定义错误视图,这更有用且更有意义。

ASP.NET Core 中的异常处理

步骤 1:对于非开发环境,使用 UseExceptionHandler()方法将异常处理中间件添加到请求处理管道。我们需要打开 Startup 类的 Configure()方法。异常处理中间件会去 ErrorController,请参考以下代码:

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

   //其他代码
}

步骤 2:修改 ErrorController 代码,它检索异常详细信息并返回自定义错误视图。在生产应用程序中,我们不会在错误视图上显示异常详细信息。我们可以将它们记录到数据库表,文件,事件查看器等,以便开发人员可以查看它们并在需要时提供代码修复。我们将在稍后的章节中讨论日志记录。

public class ErrorController : Controller
{
    [AllowAnonymous]
    [Route("Error")]
    public IActionResult Error()
    {
        //获取异常细节
        var exceptionHandlerPathFeature =
                HttpContext.Features.Get<IExceptionHandlerPathFeature>();

        ViewBag.ExceptionPath = exceptionHandlerPathFeature.Path;
        ViewBag.ExceptionMessage = exceptionHandlerPathFeature.Error.Message;
        ViewBag.StackTrace = exceptionHandlerPathFeature.Error.StackTrace;

        return View("Error");
    }
}

请注意:IExceptionHandlerPathFeature 位于 Microsoft.AspNetCore.Diagnostics 命名空间中。

步骤 3:实现错误视图

<h3>
  程序请求时发生了一个内部错误,我们会反馈给团队,我们正在努力解决这个问题。
</h3>
<h5>请通过 ltm@ddxc.org 与我们取得联系</h5>
<hr/>
<h3>错误详情:</h3>
<div class="alert alert-danger">
  <h5>异常路径:</h5>
  <hr/>
  <p>@ViewBag.ExceptionPath</p>
</div>

<div class="alert alert-danger">
  <h5>异常信息:</h5>
  <hr/>
  <p>@ViewBag.ExceptionMessage</p>
</div>

<div class="alert alert-danger">
  <h5>异常堆栈跟踪:</h5>
  <hr/>
  <p>@ViewBag.StackTrace</p>
</div>

60-3

文章说明

如果您觉得我的文章质量还不错,欢迎打赏,也可以订阅我的视频哦
未得到授权不得擅自转载本文内容,52abp.com 保留版权
感谢您对我的支持

关注微信公众号:角落的白板报

公众号:角落的白板报