异常处理的一点小总结
运行异常和编译异常区别
1.运行异常可以不用处理,
2.编译异常必须处理,try,catch处理或者throws向上抛出,
异常在事务中的应用
注意:针对spring事务控制,在service层中如果try/catch捕获了异常,那么在catch中必须再抛出异常,事务管理器才能根据异常回滚事务,否则事务不回滚
或者也可以在catch代码块中加上下面的语句而不用throw:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//回滚事务
格式如下:
@Transactional(rollbackFor = ConsoleCenterException.class)
public ConsoleResult addThirdDevelopment(ThirdDevelopmentBo thirdDevelopmentBo) throws ConsoleCenterException {
try{
thirdDevelopmentMapper.insert(thirdDevelopment);
return new ConsoleResult(true);
} catch (Exception e) {
logger.error(FunIMsgFormat.MsgStyle.DEFAULT_LOG.getFormat(“会员管理系统,新增第三方开发者信息异常”));
logger.error(FunIMsgFormat.HEAD, e);
throw new ConsoleCenterException(ThirdAppManageRespCodeConst.EXCEPTION.getCode(),
ThirdAppManageRespCodeConst.EXCEPTION.getDesc());
}
异常的其他理解
3.catch{}代码块后边的代码是可以正常执行的,throw new exception()代码后边的代码是不能执行的,而是直接抛异常给调用方法,或者try/catch捕获异常直接走catch代码块中的代码
4.service层一般是抛出异常。controller层一般是返回一个封装错误信息的对象,也可以继续抛出异常有全局异常类进行异常捕获,再返回封装错误信息的对象
5.针对一个try/多catch的语句,多个catch属于平级关系,只有一个catch会执行,catch中继续抛出异常会向上抛给调用方法,后边的catch不会继续捕获前边catch抛出的异常。
全局异常和局部异常处理
6.springmvc有全局异常处理和局部异常处理,可以在controller类中的方法上使用@ExceptionHandler注解,这样controller类中抛出异常后与该异常处理方法的异常类型相同则该异常被处理
注意:如果全局异常和局部异常都存在,具体的执行顺序是:先查找局部异常,如果不满足再查找全局异常处理,如果全局异常处理也不满足直接抛异常给页面
局部异常具体格式如下:
@ExceptionHandler(value=Exception.class)
@ResponseBody
public String handleException(Exception e){
System.out.println(“局部异常处理”);
return e.getMessage();
}
同样,也可以定义异常处理全局类来处理异常,需要在类上加注解@ControllerAdvice,类中定义异常处理方法加@ExceptionHandler,
全局异常具体格式如下:
@ControllerAdvice
public class AdviceExceptionHandler {
@ExceptionHandler(Throwable.class)
@ResponseBody
public String handlerException(Throwable e){
System.out.println(“全局的异常处理”);
return e.getMessage();
}
}