2016-09-19 58 views
2

我有一個實用程序方法來定時和記錄整個項目中的各種查詢。 問題是,現在看crashlytics現在所有不相關的崩潰都連接成一個崩潰實例。在拋出異常之前從stacktrace中刪除最後一個方法

我可以捕獲實用程序方法的所有異常,並從堆棧中移除該方法後拋出它們嗎?

環境是AndroidJava

UPDATE:

基於以下@ Dhananjay的答案,這裏是我的代碼:

public static Cursor get(...) { 
    try { 
     // my utility code 
    } catch (RuntimeException e) { 
     throw cleanException(e); 
    } 
} 

private static RuntimeException cleanException(RuntimeException e) { 
    try { 
     StackTraceElement[] stackTrace = e.getStackTrace(); 
     StackTraceElement[] subTrace = new StackTraceElement[stackTrace.length - 1]; 
     System.arraycopy(stackTrace, 1, subTrace, 0, subTrace.length); 
     e.setStackTrace(subTrace); 
     return e; 
    } catch (Throwable ignored) { 
     return e; 
    } 
} 

回答

3

這種方法可能會解決你的問題:設置在實用程序日誌記錄方法中排除實用程序方法本身的異常堆棧跟蹤,然後拋出異常,這裏是一個工作示例,可以對其進行修改以消除任何StackTraceElement要:

package test; 

public class TestMain { 

    public static void main(String args[]) throws Exception { 
     try { 
      apiCall(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    public static void apiCall() throws Exception { 
     logAndThrow(); 

    } 

    public static void logAndThrow() throws Exception { 
     Exception e = new Exception(); 
     StackTraceElement[] cleanedUpStackTrace = new StackTraceElement[e.getStackTrace().length -1]; 
     // Eliminate this mehod i.e. logAndThrow's stack trace entry (i.e. the first one) in cleanedUpStackTrace 
     System.arraycopy(e.getStackTrace(), 1, cleanedUpStackTrace, 0, cleanedUpStackTrace.length); 
     for(StackTraceElement ste : cleanedUpStackTrace) { 
      System.out.println(ste.getMethodName()); 
     } 

     e.setStackTrace(cleanedUpStackTrace); 
     throw e; 

    } 
} 

下面是該程序的輸出,該logAndThrow方法是不存在的,現在的堆棧跟蹤:

apiCall 
main 
java.lang.Exception 
    at test.TestMain.apiCall(TestMain.java:33) 
    at test.TestMain.main(TestMain.java:25) 
+0

史詩成功!我不知道我可以setStackTrace ...我只能將自己限制爲RuntimeExceptions,以避免在任何地方都添加拋出異常。我會根據您在問題中的回答發佈我的代碼 – marmor

相關問題