打印堆栈跟踪元素异常

3

当捕获到非法参数异常时,dangerousMethodHandler()会从StackTraceElement数组中打印出错误的堆栈跟踪。对于其他类型的异常,dangerousMethodHandler()会打印"Exception!"。

我目前已经解决了其他异常,但似乎无法使用StackTraceElement数组来实现我的代码。

public void dangerousMethod() {
    Character.toChars(~0);
}

public void dangerousMethodHandler() {
        try {
        this.dangerousMethod();
        }catch(IllegalArgumentException e){

          StackTraceElement[] trace = e.getStackTrace();
            e.getStackTrace();
            System.err.println(trace[0].toString());

       }    catch (Exception e){
            System.out.print("Exception!");
        }

    }

当我打印出以下内容时,我得到的结果是:
java.lang.Character.toChars(Character.java:4982)

我的输出应该是:

java\.lang\.Character\.toChars\(Character\.java:\d+\)[\s\n]+Main\.dangerousMethod\(Main\.java:\d+\)[\s\n]+Main\.dangerousMethodHandler\(Main\.java:\d+\)[\s\n]+Main\.runTests\(Main\.java:\d+\)[\s\n]+Main\.main\(Main\.java:\d+\)

为什么你不直接使用 printStackTrace(System.err) 呢? - killjoy
如果我尝试运行Main.java,就会出现以下错误:Main.java:11: 找不到符号 符号: 方法 printStackTrace(java.io.PrintStream) 位置: 类 Main printStackTrace(System.err); - M.Jones
如果我使用e.printStackTrace(System.err);,我会得到这个错误,它非常接近java.lang.IllegalArgumentException \x09在java.lang.Character.toChars(Character.java:4982) \x09在Main.dangerousMethod(Main.java:18) \x09在Main.dangerousMethodHandler(Main.java:5) \x09在Main.runTests(Main.java:26) \x09在Main.main(Main.java:22) - M.Jones
我只需要知道如何按照“My output should be:”中所示的格式将其全部拆分。 - M.Jones
2个回答

5
你只打印了数组中的第一个 StackTraceElement。你需要遍历它并打印每个元素。
for (StackTraceElement elem : trace) {
    System.err.println(elem);
}

你要如何打印出带有反斜杠和换行符的文本? - M.Jones
我以为你的输出是正则表达式。 - killjoy

3
尝试以下操作: Arrays.stream(e.getStackTrace()).skip(0).map(StackTraceElement::toString).reduce((s1, s2) -> s1 + "\n" + s2).get() 在 reduce 中,您可以定义如何构建字符串。也许这会对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接