티스토리 뷰

서버단에서는 예기치못한 치명적인 오류가 어디선가 발생하더라도 ExceptionHandlering이가능하다.

안드로이드에서도 서버처럼 앵간해서 죽지않는 어플을 만들기위해서는 그런것이 필요하다고 생각했다.


그런데 있다. 어플이 완전히 죽지않게는 할 수 없지만, try catch 하지않은 어딘가에서 치명적인 오류가 발생하여 어플이 강제종료되야 하는 상황이 발생 할 경우 어플을 다시시작한다던가, 시스템의 죄송합니다 알럿대신 커스텀하게 메시지를 뿌리고, 자체적으로 오류보고 프로세스를 구현 할 수도있다.


공개 오류보고 소스인 ACRA 을 이용하여 처리할 수 도있지만, 직접 구현도 어렵지 않다.


Application 생성하여 Manifest에 등록하고, onCreate에서 DefaultUncaughtExceptionHandler 를 직접 만들어 넣어주었다.

직접만든 커스텀UncaughtExceptionHandler 는 UncaughtExceptionHandler implement 하여 uncaughtException 를 Override하면된다.


코드는 아래와 같다.


 public class MyAppplication extends Application{

  public void onCreate(){

    Thread.setDefaultUncaughtExceptionHandler( new MyUncaughtExceptionHandler(getBaseContext() , getContentResolver() , Thread.getDefaultUncaughtExceptionHandler()) );

  }

}


public class MyUncaughtExceptionHandler implements UncaughtExceptionHandler {

  private Context mContext;

  private ContentResolver mContentResolver;

  private UncaughtExceptionHandler mDefaultUncaughtExceptionHandler;


  public MyUncaughtExceptionHandler(Context context , ContentResolver contentResolver , UncaughtExceptionHandler uncaughtExceptionHandler){

    this.mContext = context;

    this.mContentResolver = contentResolver;

    this.mDefaultUncaughtExceptionHandler = uncaughtExceptionHandler;

  }


  @Override

  public void uncaughtException(Thread _thread, Throwable _throwable) {

    final Writer result = new StringWriter();

    final PrintWriter printWriter = new PrintWriter(result);

   _throwable.printStackTrace( printWriter );

   String stacktrace = result.toString();

   printWriter.close();



// Log.e("test", "stacktrace : "+stacktrace);


// if(Thread.currentThread() == Looper.getMainLooper().getThread()){

// android.os.Process.killProcess( android.os.Process.myPid() );

// System.exit(10);

// }


   mDefaultUncaughtExceptionHandler.uncaughtException(_thread, _throwable);


  }

}



코드에는 DefaultUncaughtExceptionHandler 으로 uncaughException 을 다시 넘겨 시스템에서 처리되게 하였지만,

넘기지않고 오류에대한 처리를 구현하면 된다.


댓글