ASP.NET Core 异常处理

异常处理是任何应用程序最重要的功能之一。幸运的是,ASP.NET Core 包含一个中间件,使异常处理变得容易。在本章中,我们将学习 ASP.NET Core 应用程序中的异常处理。

默认情况下,ASP.NET Core 为应用程序中发生的任何异常返回一个简单的状态代码。考虑以下引发错误的 Configure 方法实例。

  1. public class Startup
  2. {
  3. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  4. {
  5. app.Run(context => { throw new Exception("error"); });
  6. }
  7. }

结果如下:


安装 Microsoft.AspNetCore.Diagnostics 包

为了处理异常并显示用户友好的消息,我们需要安装 Microsoft.AspNetCore.Diagnostics NuGet 包并在 Configure() 方法中添加中间件。如果使用 Visual Studio 模板创建 ASP.NET Core 应用程序,则此程序包可能已安装。如果没有,则可以通过 NuGet 管理器添加 Microsoft.AspNetCore.Diagnostics 包。

Microsoft.AspNetCore.Diagnostics 包包括以下扩展方法,用于处理不同场景中的异常:

  1. UseDeveloperExceptionPage
  2. UseExceptionHandler

UseDeveloperExceptionPage

UseDeveloperExceptionPage 扩展方法将中间件添加到显示开发人员友好的异常详细信息页面的请求管道中。这有助于开发人员跟踪开发阶段发生的错误。

由于此中间件显示敏感信息,建议只在开发环境中添加它。

  1. public class Startup
  2. {
  3. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  4. {
  5. if (env.IsDevelopment() || env.IsStaging())
  6. {
  7. app.UseDeveloperExceptionPage();
  8. }
  9. app.Run(context => { throw new Exception("error"); });
  10. }
  11. }

结果如下:

如上所述,开发人员异常页面包括 5 个选项卡:堆栈(Stack)、查询(Query)、Cookie、标头(Headers)和路由(Routing)。堆栈选项卡显示堆栈跟踪的信息,该信息指示错误发生的确切位置。查询选项卡显示有关查询字符串的信息。Cookie 选项卡显示有关请求设置的 Cookie 的信息,Headers 选项卡显示有关标头的信息,路由选显卡显示有关路由的信息。


UseExceptionHandler

MVC Core 应用程序中,我们可能需要一些其他控制器来处理所有异常并显示自定义的用户友好错误消息。 UseExceptionHandler 扩展方法支持我们配置自定义错误处理路由。当应用程序在生产环境下运行时,这非常有用。

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  2. {
  3. if (env.IsDevelopment() || env.IsStaging())
  4. {
  5. app.UseDeveloperExceptionPage();
  6. }
  7. else
  8. {
  9. app.UseExceptionHandler("/Home/Error");
  10. }
  11. //为清晰起见,已删除代码
  12. }

在上面的实例中,UseExceptionHandler("/Home/Error") 设置错误处理程序路径。如果 MVC 应用程序中发生错误,那么它会将请求重定向到 /home/error,这将执行 HomeControllererror 操作方法。

HomeController 类中创建一个简单的错误操作方法,如下所示。

  1. public class HomeController : Controller
  2. {
  3. public HomeController()
  4. {
  5. }
  6. public IActionResult Error()
  7. {
  8. return View();
  9. }
  10. // 为清晰起见,已删除代码
  11. }

以下是 Error.cshtml 的内容。

  1. @{
  2. ViewData["Title"] = "Error";
  3. }
  4. <h1 class="text-danger">Error.</h1>
  5. <h2 class="text-danger">An error occurred while processing your request.</h2>
  6. <h3>Development Mode</h3>
  7. <p>
  8. Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
  9. </p>
  10. <p>
  11. <strong>Development environment should not be enabled in deployed applications</strong>, as it can result in sensitive information from exceptions being displayed to end users. For local debugging, development environment can be enabled by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>, and restarting the application.
  12. </p>

现在,当发生错误时,它将显示如下所示的页面。

因此,我们可以配置中间件来处理 ASP.NET Core 应用程序中的异常。

备注:当您使用 MVC 模板创建 ASP.NET Core 项目时,Visual Studio 会自动在 Home 文件夹下创建 Error.cshtml