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

问题描述

我正面临这种情况,我的方法会引发一些异常。我屏蔽了异常,这样它就不会显示到底是什么,但是在堆栈跟踪中也显示了它来自的方法

代码是这样的:

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,只留下ma​​skedException

有什么办法可以实现吗?

解决方法

你可以这样做:

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 执行此操作。只需传入一个省略相关元素的数组即可。