728x90
안드로이드에서 발생하는 Exception들은 기본적으로 Throwable을 상속받고 있다.
public open class Throwable(open val message: String?, open val cause: Throwable?) {
constructor(message: String?) : this(message, null)
constructor(cause: Throwable?) : this(cause?.toString(), cause)
constructor() : this(null, null)
}
인자로 메시지와 cause Throwable을 받는다.
이를 활용해 Custom Exception을 활용할 수 있다.
보통 Exception이 발생하는 경우, FireBase Crashlytics 등으로 충돌 보고서를 로그로 남기는데,
정확히 어떤 내용의 Exception이 발생한 것인지에 대한 파악과 유형별로 문제 보고서 그룹화를 위해 사용하게 되었다.
class NetworkAdException(message: String): Throwable(message)
단순하게 Message만 받아서 만든 Exception
class ApiTaskException(
requestUrl: String?,
requestBody: String?,
header: String?,
e: Throwable?
) : Throwable(buildMessage(requestUrl, requestBody, header, e), e) {
private companion object {
fun buildMessage(requestUrl: String?, requestBody: String?, header: String?, e: Throwable?): String {
val stackList = e?.stackTrace?.mapNotNull {
if (it.toString().startsWith("com")) it.toString()
else null
}
val messageList = ArrayList<String>()
messageList.add("exception: $e")
messageList.add("message: ${e?.localizedMessage}")
messageList.add("stack: $stackList")
if (!header.isNullOrEmpty()) messageList.add("header: $header")
if (!requestUrl.isNullOrEmpty()) messageList.add("url: $requestUrl")
if (!requestBody.isNullOrEmpty()) messageList.add("request body: [\n$requestBody]")
return "{\n${messageList.joinToString(",\n")}\n}"
}
}
}
또한 다양한 값들을 인자로 받아 확인에 용이한 형태로 정리하여 하나의 Message로 처리할 수도 있다.
companion으로 데이터를 정리하고, Message를 생성하여 Throwable로 처리했다.
Non-fatal Exception: ....ApiTaskException: {
exception: java.net.UnknownHostException: Unable to resolve host
message: Unable to resolve host
stack: [com.....kt:55)],
dirty count: 0,
header: {appVersion=5., x-auth-token=eyJ, deviceId=6},
url: http://
}
이제 Crashlytics에서 위 같은 형태로 확인이 가능하다.