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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 02:35:35