기록

AndroidStudio/kotlin/Custom Exception 본문

Moblie/Android

AndroidStudio/kotlin/Custom Exception

youngyin 2022. 7. 10. 10:00

개요

firebase를 통한 로그인 서비스를 구현하던 중에 uid 값이 들어오지 않는 문제가 발생했다.

우선, uid값에 null 값이 들어오면 테스트 계정의 uid를 연결하도록 코드를 작성했다. 

class ReadUserRequest : BaseRequest() {
    override val TAG = "ReadUserRequest"
    private val DATA_PATH = "Users"

    override fun request() {
        val uid = AppApplication().getUid()

        FirebaseDatabase.getInstance()
            .reference
            .child(DATA_PATH)
            .child(uid!!)
            .get()
            .addOnSuccessListener {
                val result = it.getValue(UserResponse::class.java)
                mlistener?.onRequestSuccess(result as Object)
            }
            .addOnFailureListener {
                mlistener?.onRequestFail()
                Log.e(TAG, it.toString())
            }
    }
}

// AppApplication
fun getUid() : String {
        var uid = FirebaseAuth.getInstance().currentUser?.uid
        if(uid == null) {
            uid = "...."
        }

        return uid!!
    }

이렇게 처리한 경우, uid가 없다는 사실을 어떻게 알릴 수 있을까를 고민하다가, custom Exception을 사용했다.

예제

// AppApplication
fun getUid() : String{
    if (uid!=null) return uid!!

    var uid = FirebaseAuth.getInstance().currentUser?.uid
    try {
        if(uid == null) {
            // 우선 throw error 던지도록 처리
            throw CanNotFindUidError()
        }
    } catch (e : CanNotFindUidError){
        /**
         * 지금 uid 값이 안들어옴 나중에 여기 처리해야 함
         */
        uid = "M8mYC1eUs6RqEUrxTj7mARW3dK72"
        Log.e(TAG, e.stackTraceToString())
    }

    return uid!!
}

// CanNotFindUidError
class CanNotFindUidError : Exception() {
    override val message: String?
        get() = "firebase uid를 찾을 수 없습니다."
}

Exception

예외 처리 목적

이러한 예외를 활용하여 개발자와 사용자에게 오류발생을 알릴 수 있다. 예를 들어 유효하지 않은 경로로 진입한 경우, 사용자에게 다이얼 로그를 띄운다던가, 다음에 실행되어야 할 행동을 정의할 수 있다.

Java Exceptions Hierarchy

위 예제에서는 Exception을 사용했지만, RuntimeException을 사용할 수도 있다.

  Checked Exception
(Exception)
Unchecked Exception
(RuntimeException)
처리여부 반드시 예외 처리를 해야 함 명시적 처리를 강제하지 않음
확인시점 컴파일 단계 실행 단계

예외처리방법

   
복구 예외 발생 시 직접 처리함
회피 예외를 직접 처리하지 않고 호출한 곳에서 처리하도록 함
전환 적절한 예외로 변경하여 발생한 예외를 직접 처리하지 않고 호출한 곳에서 처리하도록 함

 

Comments