问题描述
我正面临这种情况,我的方法会引发一些异常。我屏蔽了异常,这样它就不会显示到底是什么,但是在堆栈跟踪中也显示了它来自的方法。
代码是这样的:
public Something methodForHiding() throws Exception {
try {
some code
}
catch (Exception e) {
throw ExcpetionMask.maskExep();
}
return Something
}
在堆栈跟踪中我得到:
at com.Program.maskedException
at com.Program.methodForHiding
我想从堆栈跟踪中删除这个methodForHiding,只留下maskedException
有什么办法可以实现吗?
解决方法
你可以这样做:
public class CustomException extends Exception{
public CustomException() {
StackTraceElement[] stackTrace = super.getStackTrace();
StackTraceElement[] newArray = Arrays.stream(stackTrace).filter(i -> i.getMethodName().equals("The method to remove"))
.toArray(StackTraceElement[]::new);
super.setStackTrace(newArray);
}
}
在自定义异常的构造函数中,通过调用 public void setStackTrace(StackTraceElement[] stackTrace) 来编辑堆栈跟踪。
首先使用public StackTraceElement[] getStackTrace()获取当前堆栈跟踪,然后过滤您不想在堆栈中显示的方法,并相应地设置新的堆栈跟踪。
就个人而言,我认为最好不要删除该方法,只需将其名称替换为类似
“方法从调用栈中移除”
不要误导那些必须查看堆栈跟踪才能找出错误来源的人。
,您可以使用 Throwable.setStackTrace
执行此操作。只需传入一个省略相关元素的数组即可。