在现代Web应用开发中,异常处理是保障系统稳定性和用户体验的关键环节。特别是在使用ASP.NET Core进行C# Web开发时,合理利用ASP.NET Core异常过滤器(ExceptionFilter)可以让我们以统一、集中、可维护的方式捕获和处理异常。本文将手把手教你如何创建、注册并使用异常过滤器,即使是编程小白也能轻松上手!
ExceptionFilter(异常过滤器)是ASP.NET Core MVC提供的一种过滤器类型,用于在控制器或动作方法抛出未处理异常时执行自定义逻辑。它可以:
首先,在你的ASP.NET Core项目中创建一个新类,继承自ExceptionFilterAttribute:
using Microsoft.AspNetCore.Mvc.Filters;using Microsoft.AspNetCore.Mvc;using System;public class GlobalExceptionFilter : ExceptionFilterAttribute{ public override void OnException(ExceptionContext context) { // 记录异常日志(这里简化为控制台输出) Console.WriteLine($"发生异常: {context.Exception.Message}"); // 判断是否是API请求(根据Accept头或路径) if (IsApiRequest(context.HttpContext.Request)) { // 返回JSON格式的错误响应 var result = new ObjectResult(new { error = "服务器内部错误", message = "请稍后再试" }) { StatusCode = 500 }; context.Result = result; } else { // 返回视图(如Error.cshtml) context.Result = new ViewResult { ViewName = "Error" }; } // 标记异常已处理,避免继续传播 context.ExceptionHandled = true; } private bool IsApiRequest(Microsoft.AspNetCore.Http.HttpRequest request) { return request.Path.StartsWithSegments("/api") || request.Headers["Accept"].ToString().Contains("application/json"); }} 你可以在Program.cs(.NET 6+)中将该过滤器注册为全局过滤器:
var builder = WebApplication.CreateBuilder(args);// 添加服务builder.Services.AddControllersWithViews(options =>{ options.Filters.Add<GlobalExceptionFilter>(); // 注册全局异常过滤器});var app = builder.Build();// 配置HTTP请求管道if (!app.Environment.IsDevelopment()){ app.UseExceptionHandler("/Home/Error");}app.UseStaticFiles();app.UseRouting();app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");app.Run(); 在任意控制器中抛出一个异常:
public class HomeController : Controller{ public IActionResult TestError() { throw new InvalidOperationException("这是一个测试异常!"); }} 访问 /Home/TestError,你会发现页面不会显示黄色的错误堆栈,而是跳转到你指定的错误页面或返回JSON错误信息。
在实际项目中,建议将异常信息记录到专业日志系统(如Serilog、NLog)。你可以通过依赖注入获取ILogger:
public class GlobalExceptionFilter : ExceptionFilterAttribute{ private readonly ILogger<GlobalExceptionFilter> _logger; public GlobalExceptionFilter(ILogger<GlobalExceptionFilter> logger) { _logger = logger; } public override void OnException(ExceptionContext context) { _logger.LogError(context.Exception, "未处理异常发生在 {Action}", context.ActionDescriptor.DisplayName); // ...其余逻辑同上 context.ExceptionHandled = true; }} 然后在Program.cs中注册为服务:
builder.Services.AddScoped<GlobalExceptionFilter>();builder.Services.AddControllersWithViews(options =>{ options.Filters.Add<GlobalExceptionFilter>();}); 通过使用ASP.NET Core异常过滤器(ExceptionFilter),我们能够以声明式、集中化的方式处理整个应用中的异常。这不仅提升了代码的可维护性,也增强了系统的健壮性和用户体验。无论你是刚入门的开发者,还是有经验的工程师,掌握这一技术都是C# Web开发中的必备技能。
记住,良好的异常处理不是“掩盖错误”,而是“优雅地应对错误”。希望本教程能帮助你构建更可靠的ASP.NET Core应用!
关键词:ASP.NET Core异常过滤器, ExceptionFilter, 全局异常处理, C# Web开发
本文由主机测评网于2025-12-17发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025128986.html