3

自分のエラーをログに記録した後、わざとアプリをクラッシュさせたいです。Handler は Application.onCreate() に登録されています。

// set global exception handler
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, final Throwable ex) {
  // unregister
  Thread.setDefaultUncaughtExceptionHandler(null);

  // do report ...

  // crash app -does not work, app is frozen
  if (ex instanceof RuntimeException)
    throw (RuntimeException) ex;
  throw new RuntimeException("Re-throw", ex);
}

ただし、ダイアログでクラッシュするのではなく、アプリがフリーズします。ハンドラーを登録していない場合と同じように、アプリケーションをクラッシュさせるにはどうすればよいですか?

4

1 に答える 1

6

このコードは決して機能しません。

キャッチされなかった例外が原因でスレッドが終了した、キャッチされなかった例外ハンドラーが呼び出されます。その後、例外を再スローしようとすると、それをキャッチするものは他にありません。

  • 再スローされた例外を通常どおりに処理したい場合は、スタックのさらに上にログを記録する必要があります。

  • あなたが持っている他の唯一のオプションは、明示的に別の にチェーンすることUncaughtExceptionHandlerです。


あなたが経験しているフリーズは、現在のスレッドが死んでいる直接の結果であると思われます


ファローアップ:

... Thread.setDefaultUncaughtExceptionHandler を使用せずに、Android でグローバル レベルで例外をインターセプトする他の方法はありますか?

私の知る限り、いいえ。

または、連鎖はどのように見えますか?

このようなもの:

public void uncaughtException(Thread thread, final Throwable ex) {
    // do report ...

    getSomeOtherHandler(...).uncaughtException(thread, ex);
}

または、ThreadGroup が実装しているためUncaughtExceptionHandler、...

public void uncaughtException(Thread thread, final Throwable ex) {
    // do report ...

    thread.getThreadGoup().uncaughtException(thread, ex);
}

基本的に、他のハンドラーを呼び出すだけです。それはロケット科学ではありません。

ただし、これらのハンドラーのいずれかに到達すると、「通常の」方法で例外をキャッチして回復することはできないことに注意してください。

于 2013-08-26T09:42:01.837 に答える