如何在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
相关产品推荐
相关产品推荐

