现象
在排查线上问题时候,发现线程无故中断。觉得很奇怪,首先肯定联想到是程序运行异常,中断了线程,未走到方法最后日志部分,但是执行了finally 里面的程序。
代码结构
@Test
public void testTryCatch(){
try {
m1(2);
log.info("开始执行完成m1()");
}catch (Exception e){
log.error("程序报错",e);
}
}
private void m1(int i) {
try {
log.info("开始执行1/0");
int in = 1/0;
log.info("开始执行完成1/0");
//假如没有1/0;此处会先执行return,并且确定了结果 ,但是会等 finally 里面执行完了之后 return 结果
return;
}finally {
//final 里面 return 这样写很危险,会吃掉异常
// https://www.cnblogs.com/lanxuezaipiao/p/3440471.html
log.info("执行finally方法");
return;
}
}
运行结果
总结
以上代码中 会将 1/0 的异常给吃掉,产生的原因是 在 finally 代码块里面 return 掉了,导致没有将异常信息抛出,从而在下游调用方法中认为 m1() 这个方法顺利执行完成,并未走到 catch 代码块中。
1:不要再finally 里面 写return, 如果在finally里的return之前执行了其它return , 那么最终的返回值是finally中的return。
2:有try 之后加上catch,在catch 代码块里面打上日志之后,可以处理这个异常,或者继续往外抛出
正例
private void m2(int i) {
try {
log.info("开始执行1/0");
int in = 1/0;
log.info("开始执行完成1/0");
//假如没有1/0;此处会先执行return,并且确定了结果 ,但是会等 finally 里面执行完了之后 return 结果
return;
}catch (Exception e){
log.error("程序处理异常",e);
//throw e or
//handle exception
}finally {
// https://www.cnblogs.com/lanxuezaipiao/p/3440471.html
log.info("处理一些关闭资源或者耗时日志的打印");
}
}