C# web api 自定义 异常
一、自定义
using WebApi.Result; namespace WebApi.Exceptions { public class ApiException : Exception { public ResultCodeEnum ErrorCodeEnum { get; } public ApiException(ResultCodeEnum resultCodeEnum) : base((resultCodeEnum.Message)) { ErrorCodeEnum = resultCodeEnum; } } }
二、中间件
using System.Net; using System.Text.Json; using WebApi.Exceptions; using WebApi.Result; namespace WebApi.Middlewares { public class GlobalExceptionMiddleware { private readonly RequestDelegate _next; private readonly ILogger<GlobalExceptionMiddleware> _logger; public GlobalExceptionMiddleware(RequestDelegate next, ILogger<GlobalExceptionMiddleware> logger) { _next = next; _logger = logger; } public async Task InvokeAsync(HttpContext context) { try { await _next(context); } catch (Exception ex) { await HandleExceptionAsync(context, ex); } } private async Task HandleExceptionAsync(HttpContext context, Exception exception) { context.Response.ContentType = "application/json"; context.Response.StatusCode = (int)HttpStatusCode.OK; ApiResult result; // 判断 自己的 if (exception is ApiException apiEx) { result = ApiResult.Fail(apiEx.ErrorCodeEnum); _logger.LogWarning($"异常拦截:{apiEx.ErrorCodeEnum.Message}"); } else { // 其它的 result = ApiResult.Fail(ResultCodeEnum.ServiceError.Code, $"系统发生未知错误: {exception.Message}"); _logger.LogError(exception, "系统崩溃拦截"); } // json字符串 var json = JsonSerializer.Serialize(result, new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }); await context.Response.WriteAsync(json); } } }
三、添配置(Program.cs)
var app = builder.Build(); #region 中间件 app.UseMiddleware<GlobalExceptionMiddleware>(); #endregion

浙公网安备 33010602011771号