Development/Android

[Android] Custom Exception 활용 및 데이터 Message 로그 처리

SeungYong.Lee 2023. 11. 17. 15:52
반응형

안드로이드에서 발생하는 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에서 위 같은 형태로 확인이 가능하다.

반응형