2017-05-09 112 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()

在減少,你可以定義如何構建你的字符串。也許它會幫助你。