【问题标题】:How to hide a method from Stacktrace but not its exception?如何从 Stacktrace 隐藏一个方法,但不隐藏它的异常?
【发布时间】:2021-04-04 14:45:50
【问题描述】:

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

代码是这样的:

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

有什么办法可以做到吗?

【问题讨论】:

    标签: java exception stack-trace method-hiding


    【解决方案1】:

    你可以这样做:

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

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

    “从调用堆栈中删除的方法”

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

    【讨论】:

    • 这非常有效。谢谢你的详细解释,它真的很有帮助
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      相关资源
      最近更新 更多