抛出BusinessException致Asp.Net MVC应用中断,Swagger无响应
问题解决方案
1. 调整Visual Studio调试器异常设置
VS调试器默认会在所有异常抛出时中断,哪怕是ABP本该自动处理的BusinessException。操作步骤:
- 打开VS的「调试」→「Windows」→「异常设置」(快捷键Ctrl+Alt+E)
- 在窗口中搜索
BusinessException,取消勾选「抛出」列的复选框;或者展开「Common Language Runtime Exceptions」,找到项目命名空间下的BusinessException取消抛出中断
2. 确认ABP异常处理配置的正确性
确保在模块类的ConfigureServices方法中完成正确配置,适配MVC场景:
public override void ConfigureServices(ServiceConfigurationContext context) { // 其他配置项... Configure<AbpExceptionHandlingOptions>(options => { options.SendExceptionsDetailsToClients = true; // 允许客户端接收异常详情 options.SendStackTraceToClients = false; // 根据业务需求选择是否返回堆栈信息 }); // 确保MVC控制器启用ABP异常过滤器 context.Services.AddControllersWithViews(options => { options.Filters.Add<AbpExceptionFilter>(); }); }
3. 验证FairManager中异常抛出逻辑
确保UpdateParticipantAsync方法中直接抛出BusinessException实例,而非嵌套或包装异常:
public async Task UpdateParticipantAsync(Participant participant) { if (/* 业务异常判定条件 */) { // 第一个参数是唯一错误码,第二个是用户可见的提示信息 throw new BusinessException("Fair:ParticipantUpdateFailed", "无法更新参与者,原因:xxx"); } // 其他业务逻辑... }
4. 排查自定义异常过滤器干扰
如果项目中存在自定义异常过滤器,需确保它不会拦截BusinessException,或主动调用ABP的异常处理逻辑:
public class CustomExceptionFilter : IAsyncExceptionFilter { private readonly IExceptionToErrorInfoConverter _errorInfoConverter; private readonly IHttpExceptionStatusCodeFinder _statusCodeFinder; public CustomExceptionFilter(IExceptionToErrorInfoConverter errorInfoConverter, IHttpExceptionStatusCodeFinder statusCodeFinder) { _errorInfoConverter = errorInfoConverter; _statusCodeFinder = statusCodeFinder; } public async Task OnExceptionAsync(ExceptionContext context) { if (context.ExceptionHandled) return; // 交由ABP处理BusinessException if (context.Exception is BusinessException) { var errorInfo = _errorInfoConverter.Convert(context.Exception); var statusCode = _statusCodeFinder.GetStatusCode(context.HttpContext, context.Exception); context.Result = new ObjectResult(errorInfo) { StatusCode = statusCode }; context.ExceptionHandled = true; } // 其他异常处理逻辑... } }
5. 适配Swagger的异常响应格式
确保Swagger能正确识别ABP返回的异常结构,可在模块配置中添加响应描述:
public override void ConfigureServices(ServiceConfigurationContext context) { // 其他Swagger配置... context.Services.AddSwaggerGen(options => { options.SwaggerDoc("v1", new OpenApiInfo { Title = "Fair API", Version = "v1" }); // 定义ABP异常响应的Schema options.MapType<RemoteServiceErrorInfo>(() => new OpenApiSchema { Type = "object", Properties = new Dictionary<string, OpenApiSchema> { ["code"] = new OpenApiSchema { Type = "string" }, ["message"] = new OpenApiSchema { Type = "string" }, ["details"] = new OpenApiSchema { Type = "array", Items = new OpenApiSchema { Type = "string" } } } }); }); }
内容的提问来源于stack exchange,提问作者Serhat Önal
相关产品推荐
相关产品推荐

