在ASP.NET中如何从异常中获取并设置自定义状态码与消息?
自定义状态码异常处理实现方案
1. 定义带状态码的自定义异常类
先创建一个继承自Exception的自定义异常类,用来携带HTTP状态码和自定义错误消息:
public class HttpStatusException : Exception { public int StatusCode { get; } public HttpStatusException(int statusCode, string message) : base(message) { StatusCode = statusCode; } }
2. 在业务逻辑中抛出异常
在你的代码分支里,根据场景抛出对应状态码的异常:
if (ProfileList.Count() == 0) { // 示例:资源未找到时抛出404异常 throw new HttpStatusException(StatusCodes.Status404NotFound, "未查询到任何投资组合数据"); }
如果是请求参数错误等场景,可抛出400错误:
throw new HttpStatusException(StatusCodes.Status400BadRequest, "请求参数不符合要求");
3. 捕获异常并返回响应
建议将方法返回类型改为Task<IActionResult>,这样能灵活返回成功数据或错误响应:
[HttpGet] [Route("api/Portfolio")] [ActionName("LoadNew")] public async Task<IActionResult> Get(CancellationToken cancellationToken) { try { using (var context = new AMLPContext()) { using (var manager = new PortfolioManager(context)) { var profileList = await manager.ProfileLoad(cancellationToken); if (!profileList.Any()) { throw new HttpStatusException(StatusCodes.Status404NotFound, "未查询到任何投资组合数据"); } return Ok(profileList); } } } catch (HttpStatusException ex) { return StatusCode(ex.StatusCode, new { Message = ex.Message }); } catch (Exception ex) { // 处理未预期的异常,返回500内部服务器错误 return StatusCode(StatusCodes.Status500InternalServerError, new { Message = "服务器内部错误,请稍后重试", Detail = ex.Message }); } }
4. 可选:全局异常过滤器(简化重复代码)
如果不想每个控制器都写重复的catch逻辑,可以注册全局过滤器自动处理:
public class HttpStatusExceptionFilter : IExceptionFilter { public void OnException(ExceptionContext context) { if (context.Exception is HttpStatusException statusEx) { context.Result = new ObjectResult(new { Message = statusEx.Message }) { StatusCode = statusEx.StatusCode }; context.ExceptionHandled = true; } } }
在Program.cs中注册过滤器(.NET 6+):
builder.Services.AddControllers(options => { options.Filters.Add<HttpStatusExceptionFilter>(); });
注册后,控制器只需抛出异常,无需手动捕获,过滤器会自动返回对应状态码的响应。
内容的提问来源于stack exchange,提问作者Nayeer Mahiuddin
相关产品推荐
相关产品推荐

