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

如何在catch(System.Exception)块中抛出自定义StatusCode异常

解答

你完全可以在catch (System.Exception)代码块中修改响应状态码、抛出自定义状态码的异常,实现时注意规避几个常见问题即可。

核心注意点

  • 不要无差别吞掉所有原始异常。如果要包装自定义异常抛出,必须将原始异常作为内部异常传入,否则会丢失异常堆栈,后续排查问题无法定位错误根因;禁止使用throw ex;写法重新抛出捕获到的异常,这同样会截断异常堆栈。
  • Web场景下修改状态码前要先判断响应是否已启动。如果已经开始向客户端写入响应体,此时修改StatusCode会抛出运行时异常,直接返回原始错误即可。
  • 你贴出的现有代码存在两处语法缺失:
    • return new Response<List<PersonDto>>未传入构造参数、缺少结尾分号
    • catch块未编写处理逻辑,代码块未闭合

参考实现示例

try
{
    var result = await _query.GetAllAsync<PersonDto>(nameof(Person));
    if (result == null)
    {
        throw Exceptions.UnprocessableEntity("人员列表查询结果为空");
    }
    
    return new Response<List<PersonDto>>(result);
}
catch (Exception ex)
{
    // 仅在响应未启动时修改状态码
    if (!HttpContext.Response.HasStarted)
    {
        // 自定义异常优先使用自带的状态码,其余异常默认返回500
        HttpContext.Response.StatusCode = ex is IHasStatusCodeException statusCodeEx 
            ? (int)statusCodeEx.StatusCode 
            : StatusCodes.Status500InternalServerError;
    }
    // 包装异常重新抛出,保留原始异常堆栈
    throw new CustomApiException("接口请求处理失败", ex);
}

更推荐的做法是不在业务代码的catch块中单独处理状态码,把状态码和异常类型的映射逻辑统一放到全局异常处理中间件中,业务逻辑只需要抛出对应类型的自定义异常即可,减少重复代码。

内容的提问来源于stack exchange,提问作者Fran Cresto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 11:01:23