You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

抛出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 22:20:06