2017-05-09 208 views
0

当发现非法参数异常时,危险的MethodHandler()打印来自StackTraceElement数组的错误堆栈跟踪。对于任何其他类型的异常,危险的方法处理程序()会打印“Exception!”打印堆栈跟踪元素异常

我现在已经整理出其他异常,但似乎无法实现使用StackTraceElemen阵列

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+\) 
+0

为什么不使用'printStackTrace(System.err)'? – Killjoy1221

+0

我得到这个错误,如果我尝试Main.java:11:找不到符号 symbol:方法printStackTrace(java.io.PrintStream) location:class Main printStackTrace(System.err); –

+0

如果我去e.printStackTrace(System.err);我得到这个很接近的错误java.lang.IllegalArgumentException \ x09at java.lang.Character.toChars(Character.java:4982) \ x09at Main.dangerousMethod(Main.java:18) \ x09at Main.dangerousMethodHandler( Main.java:5) \ x09at Main.runTests(Main.java:26) \ x09at Main.main(Main.java:22) –

回答

1

您只打印数组中的第一个StackTraceElement。你会想遍历它并打印每一个。

for (StackTraceElement elem : trace) { 
    System.err.println(elem); 
} 
+0

如何用反斜杠和换行符打印出来? –

+0

我认为你的输出是正则表达式。 – Killjoy1221

2

尝试以下操作: Arrays.stream(e.getStackTrace()).skip(0).map(StackTraceElement::toString).reduce((s1, s2) -> s1 + "\n" + s2).get()

在减少,你可以定义如何构建你的字符串。也许它会帮助你。