C# 异常管理中间件教程


从零开始构建异常处理系统:完整教程与项目创建指南


1. 项目创建与初始化

步骤 1:创建 ASP.NET Core Web API 项目

# 使用 .NET 8 SDK 创建 Web API 项目
dotnet new webapi -n ExceptionHandlingDemo
cd ExceptionHandlingDemo

步骤 2:项目结构初始化

在项目根目录下创建以下文件夹和文件:

mkdir Exceptions Middleware Models Controllers
touch Exceptions/NotFoundException.cs Exceptions/ValidationException.cs
touch Middleware/ExceptionHandlingMiddleware.cs
touch Models/ErrorDetails.cs
touch Controllers/DemoController.cs

2. 项目结构(带图标)

📁 ExceptionHandlingDemo/           # 项目根目录
├── 📁 Exceptions/                  # 自定义异常类
│   ├── 📄 NotFoundException.cs     # 404 异常
│   └── 📄 ValidationException.cs   # 400 验证异常
├── 📁 Middleware/                  # 异常处理中间件
│   └── 📄 ExceptionHandlingMiddleware.cs
├── 📁 Models/                      # 错误响应模型
│   └── 📄 ErrorDetails.cs
├── 📁 Controllers/                 # 示例控制器
│   └── 📄 DemoController.cs
├── 📄 Program.cs                   # 主程序配置
├── 📄 appsettings.json            # 配置文件
└── 📄 SerilogConfig.json          # 日志配置(可选)

3. 代码实现与讲解


3.1 自定义异常(Exceptions)

NotFoundException.cs
namespace ExceptionHandlingDemo.Exceptions
{
   
   
    public class NotFoundException : Exception
    {
   
   
        public NotFoundException(string message) : base(message) {
   
    }
    }
}
  • 作用:定义 404 状态码的异常,用于资源未找到场景。
ValidationException.cs
namespace ExceptionHandlingDemo.Exceptions
{
   
   
    public class ValidationException : Exception
    {
   
   
        public ValidationException(string message) : base(message) {
   
    }
    }
}
  • 作用:定义 400 状态码的异常,用于输入验证失败场景。

3.2 错误响应模型(Models)

ErrorDetails.cs
using System.Text.Json;
using System.Text.Json.Serialization;

namespace ExceptionHandlingDemo.Models
{
   
   
    public class ErrorDetails
    {
   
   
        public int StatusCode {
   
    get; set; }
        public required string Message {
   
    get; set; }
        public string? Details {
   
    get; set; }

        public override string ToString() => 
            JsonSerializer.Serialize(this, new JsonSerializerOptions {
   
    
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase 
            });
    }
}
  • 作用:定义错误响应的结构,包含状态码、错误信息和详细堆栈跟踪(开发环境)。

3.3 异常处理中间件(Middleware)

ExceptionHandlingMiddleware.cs
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;

namespace ExceptionHandlingDemo.Middleware
{
   
   
    public class ExceptionHandlingMiddleware
    {
   
   
        private readonly RequestDelegate _next;
        private readonly ILogger<ExceptionHandlingMiddleware> _logger;
        private readonly IWebHostEnvironment _env;

        public ExceptionHandlingMiddleware(
            RequestDelegate next,
            ILogger<ExceptionHandlingMiddleware> logger,
            IWebHostEnvironment env)
        {
   
   
            _next = next;
            _logger = logger;
            _env = env;
        }

        public async Task InvokeAsync(HttpContext context)
        {
   
   
            try
            {
   
   
                await _next(context);
            }
            catch (Exception ex)
            {
   
   
                await HandleExceptionAsync(context, ex);
            }
        }

        private async Task HandleExceptionAsync(HttpContext context, Exception ex)
        {
   
   
            var statusCode = GetStatusCode(ex);
            var message = GetErrorMessage(ex);
            
            // 🟢 记录日志
            _logger.LogError(ex, "Error: {Message}", ex.Message);

            // 🟢 设置响应格式
            context.Response.ContentType = "application/json";
            context.Response.StatusCode = statusCode;

            // 🟢 返回错误信息
            await context.Response.WriteAsync(new 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

得想办法娶到那个女人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值