안드로이드에서 예외처리를 하지 않은 부분에서 에러가 나버리면 앱이 그냥 종료되어 버린다.
UncaughtExceptionHandler 클래스를 이용하여 클래스 이름 그대로 예외 처리되지 않은 곳에서 에러난 것을 캣치할 수 있다.
구글에 검색해보면 여러가지로 처리할 수 있는 방법이 있으며 아래의 코드는 Thread 클래스의 스태틱 메소드인 setDefaultUncaughtExceptionHandler() 을 이용해 전체 앱에 적용을 시킨 후 에러가 발생하면 리포트를 메일로 보내는 코드이다. 지메일이 있으면 지메일을 실행시키고 없으면 이메일 앱을 고르도록 되어 있다.
닫기
public class ExceptionHandler implements UncaughtExceptionHandler {
private Context mContext = null ;
public ExceptionHandler(Context context) {
mContext = context;
}
@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
// TODO Auto-generated method stub
StringWriter sw = new StringWriter();
arg1.printStackTrace(new PrintWriter(sw));
String msg = sw.toString();
final Intent intent = new Intent(android.content.Intent.ACTION_SEND );
intent.setType("plain/text" );
intent.putExtra(android.content.Intent.EXTRA_EMAIL , new String[] { "l.kwangyeon@gmail.com " });
intent.putExtra(android.content.Intent.EXTRA_SUBJECT , "에러 보고서" );
intent.putExtra(android.content.Intent.EXTRA_TEXT , msg);
if (mContext != null ) {
PackageManager pm = mContext .getPackageManager();
List<ResolveInfo> matches = pm.queryIntentActivities(intent, 0);
ResolveInfo best = null ;
for (final ResolveInfo info : matches) {
if (info.activityInfo .packageName .endsWith(".gm" ) || info.activityInfo .name .toLowerCase ().contains("gmail" )) {
best = info;
}
}
if (best != null ) {
intent.setClassName(best.activityInfo .packageName , best.activityInfo .name );
mContext .startActivity(intent);
}
else {
mContext .startActivity(Intent.createChooser(intent, "이메일 앱 선택" ));
}
}
System.exit(0);
}
}
닫기