.NET Core中如何隐藏System.Exception错误仅在Swagger返回自定义异常消息
解决方案
你看到的行号属于异常堆栈跟踪信息,默认ASP.NET Core在开发环境会返回完整堆栈用于调试,要仅返回自定义异常消息可以按以下方案操作:
- 首选方案:添加全局异常处理中间件
这是最规范的实现方式,统一捕获所有接口抛出的异常,自定义返回格式,完全屏蔽堆栈信息。- 新建全局异常处理中间件类
public class GlobalExceptionMiddleware { private readonly RequestDelegate _next; private readonly IWebHostEnvironment _env; public GlobalExceptionMiddleware(RequestDelegate next, IWebHostEnvironment env) { _next = next; _env = env; } public async Task InvokeAsync(HttpContext context) { try { await _next(context); } catch (Exception ex) { context.Response.ContentType = "application/json"; // 处理自定义的书籍已存在异常 if (ex is BookExistException) { context.Response.StatusCode = StatusCodes.Status409Conflict; await context.Response.WriteAsJsonAsync(new { message = ex.Message }); return; } // 其他异常分环境处理 context.Response.StatusCode = StatusCodes.Status500InternalServerError; var errorMsg = _env.IsDevelopment() ? ex.Message : "服务器内部错误"; await context.Response.WriteAsJsonAsync(new { message = errorMsg }); } } }- 在Program.cs中注册中间件,注意要放在所有接口相关中间件的最前面,保证能捕获所有请求的异常
var builder = WebApplication.CreateBuilder(args); // 此处保留你原有服务注册代码,如AddControllers、AddSwaggerGen、AddDbContext等 var app = builder.Build(); // 注册全局异常中间件,必须放在最顶部 app.UseMiddleware<GlobalExceptionMiddleware>(); // 此处保留你原有中间件配置,如UseSwagger、UseAuthentication、MapControllers等 - 临时方案:关闭开发环境详细错误页
如果你不需要自定义返回格式,仅要屏蔽堆栈信息,可以直接修改Program.cs中的开发者异常页配置:if (app.Environment.IsDevelopment()) { // 删掉下面这行即可关闭堆栈信息返回 // app.UseDeveloperExceptionPage(); app.UseSwagger(); app.UseSwaggerUI(); }注意:该方案返回的错误格式为系统默认格式,自定义程度低,仅适合临时调试使用,生产环境推荐优先使用全局异常中间件方案。
配置完成后,Swagger请求错误时就只会返回你抛出的Book already exist自定义消息,不会再显示代码行号等堆栈信息。
内容的提问来源于stack exchange,提问作者user15811966
相关产品推荐
相关产品推荐

