在这种情况下如何保留堆栈跟踪?

问题描述 投票:0回答:3

在我的代码中,当我在声纳上分析代码时,出现了名为“保留堆栈跟踪”的规则违规。

try {
  doSomething();
} catch(IllegalStateException e) {
   try {
      doAnotherThing();
  } catch(IOException e1) {
      throw new MyException(e1.getCause());
  }
  throw new MyException(e.getCause());
}

那么在这种情况下如何保留堆栈跟踪?

java exception sonarqube stack-trace pmd
3个回答
2
投票

您应该分别抛出 MyException(e) 和 MyException(e1)。


1
投票

改变

throw new MyException(exception.getCause());

throw new MyException(exception);

这将保留完整的堆栈跟踪。


0
投票

正在做:

  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);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.