自定义异常及异常全局处理

原创 2018年04月14日 22:53:38

自定义异常及异常全局处理

自定义异常

先上张图:
这里写图片描述

1.java中异常均继承自Throwable,其有两个重要的直接子类error与exception

2.java错误error,大部分是由虚拟机爆出来的错误,是程序无法处理的错误,如 OutOfMemoryError,当JVM需要更多内存空间而得不到满足时,就会爆出OutOfMemoryError;

3.Exception,异常,其下分类很多,如可查异常与不可查异常,运行时异常与非运行时异常,基本概念一样,只是说法不同罢了。其有个重要的子类即RuntimeException运行时异常,其它直接子类都归为非RuntimeException,如IOException,SQLException等;
a.非RuntimeException(非运行时异常)是在代码书写时,编译器给你检查提示你要进行try catch或throws处理。
b.RuntimeException(运行时异常),编译器不会帮你自动检查,当你运行程序时,虚拟机才会给你爆出错误让你去处理,这个往往是我们编码逻辑或不规范导致的。

异常与错误的类和接口已如此之多,为什么还要自定义异常?我初入行时原来也有过困惑,但是随着项目经验及代码的规范化,自定义异常已经是项目必不可少的一步了。如下是在项目中经常定义的业务异常(BusinessException),不符合业务数据的情况所抛出的异常:

@Getter
public class BusinessException extends Exception {

    private int code;

    public BusinessException(int code,String message) {
        super(message);
        this.code = code;
    }

    public BusinessException(ResponseEnum responseEnum){
        super(responseEnum.getMessage());
        this.code=responseEnum.getCode();
    }

    //直接构建系统内部错误
    public static BusinessException systemException(String message){
        return new BusinessException(ResponseEnum.SYSTEM_ERROR.getCode(),message);
    }

}

可以在service中使用,业务性异常直接抛出:

@Service
public class UserServiceImpl implements IUserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public int addUser(User user) throws Exception{
        //如果名字为空,直接抛出异常
        if(StringUtils.isEmpty(user.getUserName())){
            throw new BusinessException(40001,"必要参数缺失");
        }
        return userMapper.addUser(user);
    }

}

自定义异常的好处:
1.异常说明明确,能够快速定位问题;
2.统一代码业务性问题处理规范;
3.方便错误数据的封装,后台数据机构的统一(统一异常拦截体现);
4.其他…项目暂时理解就这些

异常统一拦截

返回的异常,都需要经过统一的处理,同样spring也提供了接口对异常返回的建议:

@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public BaseResponse jsonErrorHandler(HttpServletRequest request, Exception e) throws Exception{
        BaseResponse response = new BaseResponse();
        if( e instanceof BusinessException ){
            response.setCode(((BusinessException)e).getCode());
            response.setMessage(e.getMessage());
        }else{
            log.error(e.getMessage(),e);
            response.setCode(ResponseEnum.SYSTEM_ERROR.getCode());
            response.setMessage(ResponseEnum.SYSTEM_ERROR.getMessage());
        }
        return response;
    }
}

@ControllerAdvice:
是一个@Component,用于定义@ExceptionHandler,@InitBinder和@ModelAttribute方法,适用于所有使用@RequestMapping方法。有兴趣的可以去了解一下。

总结:
数据统一拦截封装返回,自定义异常,异常统一拦截处理。让平时在写程序中,更多的去关注业务问题,数据的最初状态即可,后期扩展也方便。还是比较实用的。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/my_nice_life/article/details/79945340

spring boot 全局异常处理及自定义异常类

全局异常处理:定义一个处理类,使用@ControllerAdvice注解。@ControllerAdvice注解:控制器增强,一个被@Component注册的组件。配合@ExceptionHandle...
  • qq_34083066
  • qq_34083066
  • 2018-03-02 16:30:36
  • 318

php异常处理—创建自定义的异常处理器

创建一个自定义的 Exception 类 创建自定义的异常处理程序非常简单。我们简单地创建了一个专门的类,当 PHP 中发生异常时,可调用其函数。该类必须是 exception 类的一个扩展。 ...
  • guoshaoqing001
  • guoshaoqing001
  • 2015-06-02 12:20:59
  • 419

自定义全局异常捕获

1.实现HandlerExceptionResover 2.注解@ControllerAdvice
  • jinzhencs
  • jinzhencs
  • 2016-06-17 15:03:14
  • 3554

【SpringMVC整合MyBatis】springmvc异常处理-全局异常处理器开发

异常处理 1.异常处理思路 系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。 ...
  • u013517797
  • u013517797
  • 2015-08-13 08:54:18
  • 11116

dubbo处理自定义异常问题

最近在项目上遇到一个有关dubbo的问题,项目分为两层:下层是一些基础服务,上层是业务服务调用下层的基础服务。上层服务的有一个全局的异常拦截器来拦截异常。@ControllerAdvice @Slf4...
  • qq_25673113
  • qq_25673113
  • 2017-11-19 15:07:39
  • 504

通过spring的aop统一拦截Exception抛出自定义异常

通过spring的aop统一拦截Exception抛出自定义异常 Spring配置部分 Xml代码 xml version="1.0" encoding="UTF-8"?>  ...
  • truelove12358
  • truelove12358
  • 2014-09-19 12:07:10
  • 827

SpringMVC实现全局异常捕获处理

在SpringMVC中实现全局异常捕获解析以及处理并且返回json状态码
  • DuShiWoDeCuo
  • DuShiWoDeCuo
  • 2017-04-14 11:05:09
  • 3533

自定义异常处理(样例)

样例1 定义异常: package com.tianfu.yichang; /** * * @author tianfu * */ public class BanlanceNotEno...
  • ytfunnysite
  • ytfunnysite
  • 2016-12-19 14:41:35
  • 516

asp.net mvc全局异常处理

/// /// 全局异常处理 /// /// /// protected void Application_Er...
  • c13_tianming
  • c13_tianming
  • 2015-08-13 16:42:06
  • 815
收藏助手
不良信息举报
您举报文章:自定义异常及异常全局处理
举报原因:
原因补充:

(最多只允许输入30个字)