-
自定义异常的方法
先编写一个类继承Exception,需要无参和有参的构造函数,一个参数或多个参数,用于抛出的时候返回信息。
public class MyException extends Exception{
private String message;
public MyException(){}
public MyException(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
然后在你需要抛出异常的地方throw 出来即可,代码如下:
@Autowired
private GameMapper gameMapper;
public void findGame() throws MyException {
int id = 1;
try{
gameMapper.findGameById(id);
}catch(Excetion e){
e.printStackTrace();
throw new MyException("插入游戏表失败");
}
}
-
当自定义异常遇上需要事务的业务场景时
@Autowired
private GameMapper gameMapper;
@Transactional
public void insertGame() throws MyException {
int id = 1;
Game game = new Game();
game.setId(id);
try{
gameMapper.insertGame(game);
int a = 6/0;
gameMapper.findGameById(id);
}catch(Excetion e){
e.printStackTrace();
throw new MyException("插入游戏表失败");
}
}
如上图代码所示,当业务方法上面加上@Transactional 注解时,中间代码 int a = 6/ 0 ; 出现错误,并且你抛出自定义异常时候,此时insertGame(game)插入数据库表的操作不会回滚,这是因为我们自定义的异常是继承Exception的。如若要让事务回滚,抛出的异常必须是RuntimeExcetion的;
解决方案:
- 修改方法上面的注解为:@Transactional (rollbackFor = Exception.class),此举是为了修改Spring事务默认回滚的异常;
- 让自定义的异常继承RunTimeException;如下代码:
public class MyException extends RuntimeException{
private String message;
public MyException(){}
public MyException(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
- 关于事务什么情况下不能回滚,请参考事务与try/catch