我们日常工作中经常会使用try...catch处理异常,但是try...catch的使用存在这许多的小陷阱,下面我就带大家看看这些常见的小陷阱。
1、打印日志时未记录关键信息
错误写法:
这时如果你打印了错误信息,但是你却没有打印入参之类的条件的话,那么你在线上环境中难以排查错误。你可能只能凭借时间戳去寻找日志,那查找效率排错效率就会很低下。
public void testException() {
try {
//执行业务逻辑
}catch (Exception e){
log.error(e);
}
}
正确写法:
public void testException() {
try {
//执行业务逻辑
}catch (Exception e){
log.error(e+"入参为:"+入参);
}
}
2、异常捕获范围非顶级父类导致无法捕获所有异常
错误写法:
我们通常认为这样就可以捕获到所有异常,但是这样写有可能不能捕获到所有异常,因为异常的顶级父类是Throwable而非Exception ,因此需要将Exception变为Throwable才能捕获到所有异常。
try {
//执行业务逻辑
}catch (Exception e){
log.error(e);
}
正确写法:
public void testException() {
try {
//执行业务逻辑
}catch (Throwable t){
log.error(t);
}
}
3、在主线程中开启其它线程但在支线程外部捕获异常
错误代码:
如果try的是新开启的一个线程,那么这个线程里面出现的异常是catch不到。也就是说在A线程中new B线程,B线程中出现的crash跟A线程无关,A也catch不到。设计的主要初衷是线程运行是互相独立的,可以理解主线程也是一种普通的线程即可。如果线程之间异常互相干扰,那么1000个线程,一个线程挂了,其它线程跟着遭殃,这是不合理的。
public class TheadExceptionTest {
public static void main(String[] args) {
try {
new Thread(new Runnable() {
@Override
public void run() {
int i = 1 / 0;
}
}).start();
} catch (Exception e) {
}
}
}
正确写法:
public class TheadExceptionTest {
public static void main(String[] args) {
try {
new Thread(new Runnable() {
@Override
public void run() {
try {
int i = 1 / 0;
} catch (Exception e) {
System.out.println("cannot / by zero!!!");
}
}
}).start();
} catch (Exception e) {
}
}
}
参考文章:
在try catch中开启新的线程,不能捕获线程里面的异常_try里面可以new thread_ChatGPTer的博客-CSDN博客