当前位置:首页 > C# > 正文

掌握ASP.NET Core异常过滤器(ExceptionFilter)

在现代Web应用开发中,异常处理是保障系统稳定性和用户体验的关键环节。特别是在使用ASP.NET Core进行C# Web开发时,合理利用ASP.NET Core异常过滤器(ExceptionFilter)可以让我们以统一、集中、可维护的方式捕获和处理异常。本文将手把手教你如何创建、注册并使用异常过滤器,即使是编程小白也能轻松上手!

掌握ASP.NET Core异常过滤器(ExceptionFilter) ASP.NET Core异常过滤器 ExceptionFilter 全局异常处理 C# Web开发 第1张

什么是ExceptionFilter?

ExceptionFilter(异常过滤器)是ASP.NET Core MVC提供的一种过滤器类型,用于在控制器或动作方法抛出未处理异常时执行自定义逻辑。它可以:

  • 捕获未处理的异常
  • 记录日志
  • 返回友好的错误页面或JSON响应
  • 防止敏感信息泄露到客户端

第一步:创建自定义异常过滤器

首先,在你的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开发