ASP.NET Core 中的全局异常处理
admin
2021-06-03本文作者:梁桐铭- 微软最有价值专家(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 请求处理管道中 ,因此,如果我们在开发环境中运行应用程序,那么如果存在未处理的异常,我们会看到以下开发人员异常页面。
关于 异常中间件,我们在之前的章节有讲过。
DeveloperExceptionPage 中间件只能在开发环境中使用。例如,在像 Production 这样的非开发环境中使用此页面存在安全风险,因为它包含可供攻击者使用的详细异常信息。而且此异常页面对最终用户也没有任何意义。
ASP.NET Core 中非开发环境异常信息
本地开发机器上模拟在生产环境中运行应用程序将 launchSettings.json 中的 ASPNETCORE_ENVIRONMENT 变量设置为 Production。
"ASPNETCORE_ENVIRONMENT": "Production"
默认情况下,如果在生产等非开发环境中存在未处理的异常,我们会看到以下默认页面。
请注意,上图中除了显示有 个 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>
文章说明
如果您觉得我的文章质量还不错,欢迎打赏,也可以订阅我的视频哦
未得到授权不得擅自转载本文内容,52abp.com 保留版权
感谢您对我的支持