对于异常的处理,最佳的实践是每一层都把异常catch住,然后每一层都往上抛,最后在最表层把堆栈信息打印出来。记住不需要每一次层都去打印堆栈。因为每一层打印的话大家的堆栈有效信息其实是一样的。最佳的方式是在最表层进行打印。
最佳实践的代码示例:
Public void layer2() throws Exception{
try{
layer3();
}catch(Exceptione){
e.printStackTrace();//此行可选,只在最表层打印
Throw new Exception("layer2备注",e);
}
}
下面是在最表层打印 的效果:
java.lang.Exception: layer2备注
at huawei.testmain.layer2(testmain.java:27)
at huawei.testmain.layer1(testmain.java:33)
at huawei.testmain.main(testmain.java:42)
Caused by: java.lang.Exception: layer3备注
at huawei.testmain.layer3(testmain.java:16)
at huawei.testmain.layer2(testmain.java:24)
... 2 more
Caused by: java.lang.Exception: layer4备注
at huawei.testmain.layer4(testmain.java:6)
at huawei.testmain.layer3(testmain.java:13)
... 3 more
中间层打印的效果:
java.lang.Exception: layer3备注
at huawei.testmain.layer3(testmain.java:16)
at huawei.testmain.layer2(testmain.java:24)
at huawei.testmain.layer1(testmain.java:33)
at huawei.testmain.main(testmain.java:42)
Caused by: java.lang.Exception: layer4备注
at huawei.testmain.layer4(testmain.java:6)
at huawei.testmain.layer3(testmain.java:13)
... 3 more
最底层打印的效果:
java.lang.Exception: layer4备注
at huawei.testmain.layer4(testmain.java:6)
at huawei.testmain.layer3(testmain.java:13)
at huawei.testmain.layer2(testmain.java:24)
at huawei.testmain.layer1(testmain.java:33)
at huawei.testmain.main(testmain.java:42)
无论在那一层打印,都能显示从头到尾的调用信息(前提是底层有把异常往表层throw,如果没有的话表层在打印堆栈的时候会没有那个caused by后面的信息)。
但是使用不断往上抛异常然后在表层打印的方式,可以把底层抛异常时添加的备注信息也打出来。而在底层打印无法打出表层的备注信息。
如果你不加备注的话,try catch住然后再往外抛和不抓住直接抛是差不多的,就看你的finally有没有需要写的代码。