개발을 하다 보면 예상하지 못한 부분에서 크리티컬한 문제가 발생합니다.
개발자 입장에서 가장 무서운건 앱이 죽어버리는 현상입니다.
미처 예상하지 못한 부분에서 예외 상황이 발생했을 때,
확인할 수 있는 방법에 대해서 정리하려고 합니다.
1. UncaughtExceptionHandler 정의
안드로이드 공식 문서에서는 아래와 같이 정의합니다.
When a thread is about to terminate due to an uncaught exception
the Java Virtual Machine will query the thread for its
UncaughtExceptionHandler
using
Thread.getUncaughtExceptionHandler()
and will invoke the handler's
uncaughtException
method, passing the thread and the
exception as arguments.
요약해보면
예상하지 못한 곳에서 예외 상황이 발생하여 비정상 종료가 되었을때,
등록된 uncaughtExceptionHandler 에 query 한다.
그리고 핸들러의 uncaughtException 메소드에서 exception 인수를 받을 수 있다.
2. UncaughtExceptionHandler 활용
A. application class 등록
<application
android:name=".MyApplication"
.....
</application>
B. application class 생성자
init {
val handler = Thread.UncaughtExceptionHandler { _, exception ->
// UI 출력
object : Thread() {
override fun run() {
Looper.prepare()
Toast.makeText(applicationContext, "비정상 종료", Toast.LENGTH_SHORT).show()
Looper.loop()
}
}.start()
try {
Thread.sleep(2000)
} catch (e: InterruptedException) {
e.printStackTrace()
}
// uncaughtException File 저장
makeExceptionFile(exception)
// 앱 종료
Process.killProcess(Process.myPid())
exitProcess(0)
}
// uncaughtExceptionHandler 등록
Thread.setDefaultUncaughtExceptionHandler(handler)
}
예상하지 못한 예외 발생이 나왔다면
UI 에 토스트 메세지를 뿌려주고 해당 exception 내용을 파일로 남기도록 구현하였습니다.
끝으로..
앱이 비정상 종료되면 어떤 상황에서 발생했는지 또는 어떤 원인으로 발생했는지
파악하기가 어려울 때가 있습니다. 비교적 간단한 코딩으로 구현이 가능하기 떄문에
해당 기능은 개발에 많은 도움이 될 것 같습니다.
[참고자료]
0 comments: