0

でスローされた例外をキャッチしていない私は私のActivityで現在のスレッドのデフォルトUncaughtExceptionHandlerを設定年代onCreate()と私のAlertDialogからRunTimeExceptionを投げる年代onClick()リスナーが、例外がキャッチされていません。私もonCreateOptionsMenu()onOptionsItemSelected()から例外を投げてみましたが、それは捕まえられませんでした。しかし、それはonCreate()またはonResume()からスローされたとき捕らえられます。ここでスレッドのDefaultUncaughtExceptionHandler AlertDialogのonClick()メソッド

は私の活動です:

public class MainActivity extends AppCompatActivity implements DialogInterface.OnClickListener { 

    private static final String TAG = "MainActivity"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Thread.setDefaultUncaughtExceptionHandler(new DefExcHandler()); 
     Log.d(TAG, "onCreate: "+Thread.currentThread().getName()+" "+Thread.currentThread().getId()); 

     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setNeutralButton("CRASH", this); 
     AlertDialog dialog = builder.create(); 
     dialog.show(); 
     dialog.setCancelable(false); 
     dialog.setCanceledOnTouchOutside(false); 
    } 

    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     dialog.dismiss(); 
     Log.d(TAG, "onClick: "+Thread.currentThread().getName()+" "+Thread.currentThread().getId()); 
     throw new RuntimeException(); 
    } 
} 

そしてここでは、私の例外ハンドラです:私は私の活動にスレッドがときonCreate()onClick()で同じであることを確認してくださいログメッセージに基づいて

public class DefExcHandler implements Thread.UncaughtExceptionHandler { 

    private static final String TAG = "DefExcHandler"; 

    public DefExcHandler() { 
     Log.d(TAG, "DefaultExceptionHandler: "); 
    } 

    @Override 
    public void uncaughtException(Thread thread, Throwable ex) { 
     Log.d(TAG, "Uncaught exception caught: "+ex.getMessage()+" "+ex.getCause().toString()); 
    } 
} 

09-27 15:00:57.260 10667-10667/a.b.c D/MainActivity: onCreate: main 1 
09-27 15:01:52.680 10667-10667/a.b.c D/MainActivity: onClick: main 1 

例外がキャッチされないのはなぜですかonClick()onCreateOptionsMenu()またはonOptionsItemSelected()からスローされたとき?

答えて

0

私はアプリケーションの動作を再現しようとしました。 DefExcHandlerインスタンスは何もロギングしていないので見逃されているようですが、私は2つの作業、つまりブレークポイントとファイル作成を試みました。

uncaughtException()の中にブレークポイントを設定してください。私はそれがあなたのコードで実行を停止すると信じています。そして私は、キャッチされていない例外ハンドラが実際に呼び出されていることを示すフラグとしてファイルを使用する以下の例を作成しました。

合計で、DefExcHandler.uncaughtException()が呼び出されているようですが、Androidが何らかの不明な理由で内部ロギングの状態を記録できないようです。

// Example that assures that an UncaughtExceptionHandler 
// is being invoked by flagging execution with file creation. 

public class MainActivity extends ... implements ... { 

    private File mCrashFile; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     mCrashFile = new File(getFilesDir(), "crash"); 

     // Crash file existence means the application has crashed before. 
     Log.d(TAG, "crash file exists: " + mCrashFile.exists()); 

     // Clear crash flag. 
     if (mCrashFile.exists()) { 
      Log.d(TAG, "crash file delete: " + mCrashFile.delete()); 
     } 

     Thread.setDefaultUncaughtExceptionHandler(new DefExcHandler()); 

     ... 

    } 

    private class DefExcHandler implements Thread.UncaughtExceptionHandler { 

     @Override 
     public void uncaughtException(Thread thread, Throwable ex) { 

      // Set crash flag. 
      try { 
       mCrashFile.createNewFile(); 
      } catch (IOException e) { 
       // dunno if it really prints anything 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
+0

ログメッセージによって実際に問題が発生しました。非常に奇妙な行動 – batati

関連する問題