假设有一个功能的执行需要进行递归调用,但是在递归执行过程中,可能会引发异常,如果引发的异常,就得记录以及递归调用了多少次,以及递归出现错误的具体异常信息和引发异常的行。
测试代码如下:
public class NestedTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
NestedTest a=new NestedTest();
a.t(0, 10);
}
public void t(int i,int last) {
i++;
try {
if(i==last) {
throw new RuntimeException("这是异常:"+i);
}
t(i,last);
}catch (Exception e) {
// TODO: handle exception
throw new MyException("异常信息:"+e.getMessage(),e);
}
}
}
public class MyException extends RuntimeException {
public MyException(String mes ,Throwable cause){
super( mes , cause);
}
public MyException(String mes){
super( mes );
}
public MyException(Throwable cause){
super( cause);
}
}
以上这个代码如果直接执行,会打印差不多9个格式一模一样的追加的信息提示
Exception in thread "main" other.MyException: 异常信息:异常信息:异常信息:异常信息:异常信息:异常信息:异常信息:异常信息:异常信息:异常信息:这是异常:10
at other.NestedTest.t(NestedTest.java:22)
at other.NestedTest.main(NestedTest.java:10)
Caused by: other.MyException: 异常信息:异常信息:异常信息:异常信息:异常信息:异常信息:异常信息:异常信息:异常信息:这是异常:10
at other.NestedTest.t(NestedTest.java:22)
at other.NestedTest.t(NestedTest.java:19)
... 1 more
Caused by: other.MyException: 异常信息:异常信息:异常信息:异常信息:异常信息:异常信息:异常信息:异常信息:这是异常:10
at other.NestedTest.t(NestedTest.java:22)
at other.NestedTest.t(NestedTest.java:19)
... 2 more
Caused by: other.MyException: 异常信息:异常信息:异常信息:异常信息:异常信息:异常信息:异常信息:这是异常:10
at other.NestedTest.t(NestedTest.java:22)
at other.NestedTest.t(NestedTest.java:19)
... 3 more
Caused by: other.MyException: 异常信息:异常信息:异常信息:异常信息:异常信息:异常信息:这是异常:10
at other.NestedTest.t(NestedTest.java:22)
at other.NestedTest.t(NestedTest.java:19)
... 4 more
Caused by: other.MyException: 异常信息:异常信息:异常信息:异常信息:异常信息:这是异常:10
at other.NestedTest.t(NestedTest.java:22)
at other.NestedTest.t(NestedTest.java:19)
... 5 more
Caused by: other.MyException: 异常信息:异常信息:异常信息:异常信息:这是异常:10
at other.NestedTest.t(NestedTest.java:22)
at other.NestedTest.t(NestedTest.java:19)
... 6 more
Caused by: other.MyException: 异常信息:异常信息:异常信息:这是异常:10
at other.NestedTest.t(NestedTest.java:22)
at other.NestedTest.t(NestedTest.java:19)
... 7 more
Caused by: other.MyException: 异常信息:异常信息:这是异常:10
at other.NestedTest.t(NestedTest.java:22)
at other.NestedTest.t(NestedTest.java:19)
... 8 more
Caused by: other.MyException: 异常信息:这是异常:10
at other.NestedTest.t(NestedTest.java:22)
at other.NestedTest.t(NestedTest.java:19)
... 9 more
Caused by: java.lang.RuntimeException: 这是异常:10
at other.NestedTest.t(NestedTest.java:17)
... 10 more
如果有100个,那看异常信息更加困难了,我希望能把这类异常信息列表的异常数量缩减到最多2个,第一个异常信息是递归中引发异常的代码位置,第二个是记录递归调用了多少次了
如何良好的记录递归调用中引发的信息?其中必须要记录的是递归层次。但是不能为了记录异常,而在递归方法的参数列表里增加多余的参数来作为递归的异常记录,这是不行的,必须在catch内自定义处理,可以自定义继承的RuntimeException子类来完成。
那么如何做?有哪些比较好的代码处理流程?