【问题标题】:How to set custom exception with status code如何使用状态码设置自定义异常
【发布时间】:2021-09-19 08:39:33
【问题描述】:

我能够通过我的自定义异常类获得错误消息,但它似乎总是返回 500 状态代码。

如何使用我的自定义异常类设置状态代码?

这是应用流程:

服务:

throw new UCodeException("Already exist", StatusCodes.Status409Conflict);

UCodeException:

 public class UCodeException : UException
    {
        public override int StatusCode { get; }

        public UCodeException(string error, int statusCode) : base(error)
        {
            StatusCode = statusCode;
        }

        public UCodeException(string[] errors, int statusCode) : base(errors)
        {
            StatusCode = statusCode;
        }

    }

UException:

public abstract class UException : Exception
{
    public string[] Errors { get; }
    public abstract int StatusCode { get; }

    protected UException(string error) : base(error)
    {
        Errors = new []{error};
    }
    
    protected UException(string[] errors)
    {
        Errors = errors;
    }
} 

【问题讨论】:

    标签: c# asp.net asp.net-mvc


    【解决方案1】:

    你可以通过Filter实现它

    1. 创建一个名为HttpResponseExceptionFilter的操作过滤器:
      public class HttpResponseExceptionFilter : IActionFilter, IOrderedFilter
      {
          public void OnActionExecuting(ActionExecutingContext context) { }
      
          public void OnActionExecuted(ActionExecutedContext context)
          {
              if (context.Exception is UCodeException exception)
              {
                  context.Result = new ObjectResult(exception.Errors)
                  {
                      StatusCode = exception.StatusCode,
                  };
                  context.ExceptionHandled = true;
              }
          }
      }
      
    2. 在Startup.ConfigureServices 中,将操作过滤器添加到过滤器集合中:
      services.AddControllers(options =>
          options.Filters.Add(new HttpResponseExceptionFilter()));
      

    或者编写自定义异常middleware。创建名为ExceptionMiddleare的类:

    public class ExceptionMiddleware
    {
        private readonly RequestDelegate _next;
    
        public ExceptionMiddleware(RequestDelegate next)
        {
            _next = next;
        }
    
        public async Task InvokeAsync(HttpContext context)
        {
            try
            {
                await _next(context);
            }
            catch (Exception ex)
            {
                if (ex is HttpResponseException exception)
                {
                    context.Response.StatusCode = exception.StatusCode;
                }
            }
        }
    }
    

    在Startup.Configure 中添加中间件(app.UseEndpoints 之前):

    app.UseMiddleware<ExceptionMiddleware>();
    

    【讨论】:

      猜你喜欢
      • 2021-12-29
      • 2021-12-02
      • 2017-08-23
      • 2022-11-08
      • 1970-01-01
      • 2016-11-21
      • 2019-09-08
      • 1970-01-01
      • 2019-07-17
      相关资源
      最近更新 更多