2012-01-29 26 views
6

在我的應用程序類中,我試圖趕上它發生之前關閉的力量,所以我可以記錄它,然後重新拋出它,以便Android可以處理它。我這樣做是因爲有些用戶不報告強制關閉。Rethrow UncaughtExceptionHandler異常後記錄它

我在eclipse中開發,eclipse不允許我重新拋出異常。它顯示錯誤說「未處理的異常類型Throwable:帶有try/catch的環繞聲」。我如何重新拋出異常?

public class MainApplication extends Application 
{ 
    @Override 
    public void onCreate() 
    { 
    super.onCreate(); 

    try 
    { 
     //Log exception before app force closes 
     Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() { 
      @Override 
      public void uncaughtException(Thread thread, Throwable ex) { 
       AnalyticsUtils.getInstance(MainApplication.this).trackEvent(
         "Errors",      // Category 
         "MainActivity",     // Action 
         "Force Close: "+ex.toString(), // Label 
         0);        // Value 
       AnalyticsUtils.getInstance(MainApplication.this).dispatch(); 

       Toast.makeText(MainApplication.this, "Snap! Something broke. Please report the Force Close so I can fix it.", Toast.LENGTH_LONG); 

       //rethrow the Exception so user can report it 
       //throw ex; //<-- **eclipse is showing an error to surround with try/catch** 
      } 
     }); 

    } catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

}

回答

12

道歉,而不是Android的專家 - 但看起來像,因爲你的方法簽名「無效uncaughtException(螺紋,Throwable的)」不聲明它「拋出」你不能把前任何東西。

假設你重寫了一個API接口,並且(a)不能修改這個簽名,並且(b)不想因爲你將它拋出上下文而拋棄它,你是否可以使用裝飾器模式基本上是將默認的UncaughtExceptionHandler實現子類化來記錄消息,然後讓它像往常一樣繼續處理?

編輯:未經檢驗的,但是這可能看起來有點像:

final UncaughtExceptionHandler subclass = Thread.currentThread().getUncaughtExceptionHandler(); 
    Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() { 
     @Override 
     public void uncaughtException(Thread thread, Throwable ex) { 
      // your code 
      AnalyticsUtils.getInstance(MainApplication.this).trackEvent(
        "Errors",      // Category 
        "MainActivity",     // Action 
        "Force Close: "+ex.toString(), // Label 
        0);        // Value 
      AnalyticsUtils.getInstance(MainApplication.this).dispatch(); 
      Toast.makeText(MainApplication.this, "Snap! Something broke. Please report the Force Close so I can fix it.", Toast.LENGTH_LONG).show(); 

      // carry on with prior flow 
      subclass.uncaughtException(thread, ex); 
     } 
    }); 
+0

嗯我認爲你是對的。我不熟悉裝飾模式,你能展示一些代碼來告訴我如何做到這一點嗎? – 2012-01-29 04:45:16

+0

是的工作!謝謝Capn麻雀。 (注:吐司沒有顯示。) – 2012-01-29 06:07:36

+0

這裏遲到了,但因爲我剛剛使用Capn Sparrow的解決方案,所以我應該指出吐司不會顯示,因爲在makeText調用結束時現在有.show()。這讓我經常這樣。 – AJ87uk 2012-07-20 14:22:19

0

我不能完全肯定,如果這是你想要的,但你可以添加一個finally條款,將後要麼成功運行try或處理catch

try { 
    //your code 
} catch (Exception e) { 
    //print stack trace 
} finally { 
    //Log 
} 
+0

不是我正在尋找的東西,因爲我想要一個「全部捕獲」,它會在強制關閉我的應用程序之前記錄任何異常。我使用try/catches,但以防萬一。 – 2012-01-29 04:46:52

0

我想下面的代碼應該工作。使用新的線程執行處理程序代碼允許應用程序顯示警報/敬酒並執行其他操作。

此外,您可能會在退出run()之前嘗試調用System.exit(0)。這重新啓動了最後的活動。

我檢查了這兩個姜麪包以及果凍豆

final UncaughtExceptionHandler subclass = Thread.currentThread().getUncaughtExceptionHandler(); 
    Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() { 
     @Override 
     public void uncaughtException(Thread thread, Throwable ex) { 
      new Thread() { 
       @Override 
       public void run() { 
        Looper.prepare(); 
        // your code 
        AnalyticsUtils.getInstance(MainApplication.this).trackEvent(
          "Errors",      // Category 
          "MainActivity",     // Action 
          "Force Close: "+ex.toString(), // Label 
          0);        // Value 
        AnalyticsUtils.getInstance(MainApplication.this).dispatch(); 
        Toast.makeText(MainApplication.this, "Snap! Something broke. Please report the Force Close so I can fix it.", Toast.LENGTH_LONG); 

        Looper.loop(); 
       } 
      }.start(); 
     } 
    });