【问题标题】:Which system exception for Bad Request错误请求的哪个系统异常
【发布时间】:2020-05-05 16:38:18
【问题描述】:

我有一个调用服务类的 API 控制器。在服务类内部,我想抛出一个异常,以便 API 控制器可以捕获它,并返回一个 Http-BadRequest 响应。 但是什么异常等于 Bad Request?对于这种情况,最佳做法是什么?

【问题讨论】:

    标签: asp.net asp.net-core


    【解决方案1】:

    我使用这种模式在应用层抛出异常,并且 api 层会识别 http 状态码:

    异常定义:

    public class BadRequestException : Exception
    {
        public BadRequestException(string message = null)
            : base(message == null ? "Bad Request" : message)
        { }
    }
    
    public class ActionInputIsNotValidException : BadRequestException
    {
        public ActionInputIsNotValidException()
            : base("Action input is not valid")
        { }
    }
    

    在 api 层处理异常的动作过滤器:

    public class ExceptionActionFilter : ExceptionFilterAttribute
    {
        public ExceptionActionFilter()
        {
        }
    
        public override void OnException(ExceptionContext context)
        {
            context.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
            context.HttpContext.Response.ContentType = "application/json";
    
            if (isTypeOf(context.Exception, typeof(Exceptions.BadRequestException)))
            {
                context.HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
            }
    
            context.Result = new JsonResult(new
            {
                Message = context.Exception.Message,
            });
        }
    
        private bool isTypeOf(Exception exception, Type baseType)
        {
            return exception.GetType() == baseType || exception.GetType().IsSubclassOf(baseType);
        }
    }
    

    然后在应用层我们可以抛出异常,api调用的结果将是一个json,包含带有http 400状态码的错误消息:

    throw new ActionInputIsNotValidException();
    

    【讨论】:

    • 是否仅通过将类添加到项目中来使用过滤器?还是需要以某种方式链接?
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2015-01-06
    • 2013-02-03
    • 1970-01-01
    相关资源
    最近更新 更多