如何从 Stacktrace 中隐藏一个方法而不是它的异常?

How to hide a method from Stacktrace but not its exception?

我遇到这种情况,我的方法抛出一些异常。我屏蔽了异常,因此不会显示它到底是什么,但是在堆栈跟踪中也显示了它来自的方法。

代码是这样的:

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

有什么办法可以实现吗?

您可以使用 Throwable.setStackTrace 执行此操作。只需传入一个省略相关元素的数组即可。

您可以按照以下方式进行:

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()获取当前堆栈跟踪,然后过滤您不想在堆栈中显示的方法,并相应地设置新的堆栈跟踪。

就个人而言,我认为最好不要删除该方法,只需将其名称替换为

"Method removed from call stack"

不要误导那些必须查看堆栈跟踪才能找出错误来源的人。