ASP.NET HandleError
最后修改于 2025 年 4 月 3 日
在本文中,我们使用 HandleError 探索 ASP.NET 8 中的错误处理。正确的错误处理对于构建健壮的 Web 应用程序至关重要。
ASP.NET 提供了多种错误处理机制。HandleError 属性提供了一种声明式的方法来管理控制器中的异常。
基本定义
ASP.NET 中的 HandleError 属性允许您指定如何处理控制器操作的异常。它是 MVC 框架的一部分。
当应用于控制器或操作方法时,HandleError 会捕获执行期间未处理的异常。它可以重定向到自定义错误视图。
HandleError 与 ASP.NET 错误处理管道协同工作。它为操作或控制器级别的异常处理提供了精细控制。
ASP.NET HandleError 示例
以下示例演示了在带有 .NET 8 的 ASP.NET MVC 应用程序中使用 HandleError。
Program.cs
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllersWithViews(options => { options.Filters.Add(new HandleErrorAttribute() { ExceptionType = typeof(Exception), View = "Error" }); }); var app = builder.Build(); if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
这会在 ASP.NET 应用程序中设置全局错误处理。HandleErrorAttribute 被注册为全局过滤器。
Controllers/ProductsController.cs
using Microsoft.AspNetCore.Mvc; using System.Diagnostics; public class ProductsController : Controller { private readonly List<Product> _products = new() { new Product(1, "Laptop", 999.99m), new Product(2, "Mouse", 19.99m), new Product(3, "Keyboard", 49.99m) }; [HandleError(ExceptionType = typeof(KeyNotFoundException), View = "ProductNotFound")] public IActionResult Details(int id) { var product = _products.FirstOrDefault(p => p.Id == id); if (product == null) { throw new KeyNotFoundException($"Product {id} not found"); } return View(product); } [HandleError(ExceptionType = typeof(DivideByZeroException), View = "MathError")] public IActionResult CalculateDiscount(int productId, decimal divisor) { var product = _products.First(p => p.Id == productId); var discountedPrice = product.Price / divisor; return View(discountedPrice); } } public record Product(int Id, string Name, decimal Price);
此控制器演示了两种不同的错误处理场景。Details 操作使用自定义视图处理找不到产品错误。
CalculateDiscount 操作专门捕获 DivideByZeroException。每个 HandleError 属性都指定要捕获的异常类型。
Views/Shared/Error.cshtml
@model ErrorViewModel @{ ViewData["Title"] = "Error"; } <h1 class="text-danger">Error.</h1> <h2 class="text-danger">An error occurred while processing your request.</h2> @if (Model.ShowRequestId) { <p> <strong>Request ID:</strong> <code>@Model.RequestId</code> </p> } <h3>Development Mode</h3> <p> Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred. </p>
这是将为未处理异常显示的默认错误视图。可以为特定异常创建自定义错误视图。
该示例展示了 HandleError 如何提供对异常处理的精细控制。不同的异常可以路由到不同的视图。
来源
Microsoft ASP.NET MVC Filters 文档
在本文中,我们探索了 ASP.NET 8 中的 HandleError 属性。这个强大的功能简化了 MVC 应用程序中的异常处理。