2012-01-29 5 views
6

私のアプリケーションクラスで、私はそれが起こる前に強制終了をキャッチしようとしています。したがって、ログに記録してからアンドロイドが処理できるように再スローできます。いくつかのユーザーは強制終了を報告しないので、私はこれを行います。ロギング後に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

うーん、私はあなたが正しいと思います。私はデコレータパターンに慣れていない、私はこれを行う方法を私に示すいくつかのコードを表示することができますか? –

+0

それはうまくいった!ありがとうCapn Sparrow。 (注:トーストは表示されません) –

+0

私はちょうどCapn Sparrowのソリューションを使用しましたが、makeText呼び出しの最後に.show()が存在するため、トーストが表示されないことを指摘しておきます。これは私をとても頻繁にします。 – AJ87uk

0

、しかし、あなたはどちらか成功した後に実行されますfinally句を追加することができますtryまたは取り扱うcatch

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

私が探しているものではありません。アプリを閉じる前に例外をログに記録する「すべてをキャッチしたい」と思います。私はtry/catchを使いますが、もし何かが捕らえられない場合に備えて。 –

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(); 
     } 
    }); 
関連する問題