0

나는 나의 Activity에서 현재 스레드에 대한 기본 UncaughtExceptionHandler 설정의 onCreate()AlertDialog에서 RunTimeException 던져의 onClick() 리스너를하지만, 예외가 잡힌되지 않습니다. 나는 또한 onCreateOptionsMenu()onOptionsItemSelected()에서 예외를 던지려고했는데 잡히지 않았다. onCreate() 또는 onResume()에서 던져지면 잡힐 수 있습니다. 여기 스레드의 DefaultUncaughtExceptionHandler 잡기되지 예외() 메소드

내 활동입니다 :

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 인스턴스는 아무것도 로깅하지 않으므로 놓친 것 같습니다. 그러나 두 가지 다른 작업을 시도했습니다. 중단 점과 파일 생성입니다.

uncaughtException() 안에 중단 점을 설정하십시오. 나는 그것이 당신의 코드에서 실행을 멈출 것이라고 믿는다. 그리고 나는 캐치되지 않은 예외 처리기가 실제로 호출되고 있음을 나타 내기 위해 파일을 플래그로 사용하는 예제를 작성했습니다.

요약하면 DefExcHandler.uncaughtException()이 호출되고 있지만 안드로이드는 몇 가지 알 수없는 이유로 로깅을 수행 할 수없는 것 같습니다. 내부 경쟁 조건 일 수 있습니다.

// 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