爱上MVC~业务层刻意抛出异常,全局异常的捕获它并按格式返回

简介:

对于业务层的程序的致命错误,我们一直的做法就是直接抛出指定的异常,让程序去终断,这种做法是对的,因为如果一个业务出现了致命的阻塞的问题,就没有必要再向上一层一层的返回了,但这时有个问题,直接抛异常,意味着服务器直接500了,前端如何去显示,或者如果你是API的服务,如果为前端返回,如果是500,那直接就挂了,哈哈!

下面是在MVC环境下优化的全局异常捕获代码(非API)

    /// <summary>
    /// 全局异常捕获
    /// </summary>
    public class GlobalExceptionFilterAttribute : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext context)
        {
            JsonResult response = new JsonResult()
            {
                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            };
            if (context.Exception is ArgumentException)
            {
                var exception = (ArgumentException)context.Exception;
                response.Data = new
                {
                    statusCode = System.Net.HttpStatusCode.InternalServerError,
                    errorcode = "02",
                    message = exception.Message,
                };
            }
            else if (context.Exception is Exception)
            {
                var exception = (Exception)context.Exception;
                response.Data = new
                {
                    statusCode = System.Net.HttpStatusCode.InternalServerError,
                    errorcode = "01",
                    message = exception.Message,
                };
            }
            else
            {

                response.Data = new
                {
                    statusCode = System.Net.HttpStatusCode.InternalServerError,
                    errorcode = "03",
                    message = "其它异常",
                };
            }

            context.Result = response;
            context.ExceptionHandled = true;
            context.HttpContext.Response.Clear();
            context.HttpContext.Response.TrySkipIisCustomErrors = true;
        }


    }

如果业务层有问题,直接就throw了

   if (id == 0)
        throw new ArgumentException("id不能为0");
   if (id < 0)
        throw new ArgumentException("id不能是负数");

然后页面后,故意让它抛出异常,我们看一下页面响应的结果

事实上,对于服务器来说,它是200,正常返回的,而对不业务模块来说,它的状态是个500,呵呵,这点要清楚.

感谢各位阅读!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:爱上MVC~业务层刻意抛出异常,全局异常的捕获它并按格式返回,如需转载请自行联系原博主。

目录
相关文章
|
7月前
|
前端开发 Java API
Spring MVC相关异常类
Spring MVC相关异常类
41 0
|
前端开发 Java Spring
Spring MVC框架:第十七章:异常映射
Spring MVC框架:第十七章:异常映射
Spring MVC框架:第十七章:异常映射
|
缓存 前端开发 架构师
@ExceptionHandler or HandlerExceptionResolver?如何优雅处理全局异常?【享学Spring MVC】(下)
@ExceptionHandler or HandlerExceptionResolver?如何优雅处理全局异常?【享学Spring MVC】(下)
@ExceptionHandler or HandlerExceptionResolver?如何优雅处理全局异常?【享学Spring MVC】(下)
|
JSON 前端开发 架构师
@ExceptionHandler or HandlerExceptionResolver?如何优雅处理全局异常?【享学Spring MVC】(中)
@ExceptionHandler or HandlerExceptionResolver?如何优雅处理全局异常?【享学Spring MVC】(中)
@ExceptionHandler or HandlerExceptionResolver?如何优雅处理全局异常?【享学Spring MVC】(中)
|
JSON 缓存 前端开发
@ExceptionHandler or HandlerExceptionResolver?如何优雅处理全局异常?【享学Spring MVC】(上)
@ExceptionHandler or HandlerExceptionResolver?如何优雅处理全局异常?【享学Spring MVC】(上)
@ExceptionHandler or HandlerExceptionResolver?如何优雅处理全局异常?【享学Spring MVC】(上)
|
监控 前端开发 架构师
web九大组件之---HandlerExceptionResolver异常处理器使用详解【享学Spring MVC】(下)
web九大组件之---HandlerExceptionResolver异常处理器使用详解【享学Spring MVC】(下)
web九大组件之---HandlerExceptionResolver异常处理器使用详解【享学Spring MVC】(下)
|
前端开发 Java Spring
web九大组件之---HandlerExceptionResolver异常处理器使用详解【享学Spring MVC】(中)
web九大组件之---HandlerExceptionResolver异常处理器使用详解【享学Spring MVC】(中)
web九大组件之---HandlerExceptionResolver异常处理器使用详解【享学Spring MVC】(中)
|
JSON 前端开发 Java
web九大组件之---HandlerExceptionResolver异常处理器使用详解【享学Spring MVC】(上)
web九大组件之---HandlerExceptionResolver异常处理器使用详解【享学Spring MVC】(上)
web九大组件之---HandlerExceptionResolver异常处理器使用详解【享学Spring MVC】(上)
|
前端开发 Java Spring
Spring MVC 处理异常的3种方式
三种方式 @ExceptionHandler标注的方法被定义为处理指定类型异常; @ResponseStatus标注的方法执行,会修改响应头中的状态码; Spring会把@ControllerAdvice的类内部使用@ExceptionHandler方法应用到所有的 @RequestMapping注解的方法上 ExceptionHandler注解方式 注:@ExceptionHandler标注的方法,方法签名灵活、多变。
1274 0