在我的代码中,当我在声纳上分析代码时,出现了名为“保留堆栈跟踪”的规则违规。
try {
doSomething();
} catch(IllegalStateException e) {
try {
doAnotherThing();
} catch(IOException e1) {
throw new MyException(e1.getCause());
}
throw new MyException(e.getCause());
}
那么在这种情况下如何保留堆栈跟踪?
您应该分别抛出 MyException(e) 和 MyException(e1)。
改变
throw new MyException(exception.getCause());
到
throw new MyException(exception);
这将保留完整的堆栈跟踪。
正在做:
try {
doSomething();
} catch(IllegalStateException e) {
try {
doAnotherThing();
} catch(IOException e1) {
throw new MyException(e1);
}
throw new MyException(e);
}
可能还不够!
这取决于您如何实现 MyException(Throwable Cause) 构造函数。
这是正确的方法:
public class MyException extends RuntimeException {
public MyException(Throwable cause) {
super(cause);
}
}