Android/XML + Android

Exception과 runCatching

chattymin 2023. 11. 15. 14:22
728x90
반응형

Exception이란?

쉽게 말해서 error다.

제일 흔한 예시로 NullPointerException, ArrayIndexOutOfBoundsException 등등이 있을 것이다.

 

그럼 exception은 발생하면 안되는 걸까?

물론 정상적으로 작성된 코드에서는 발생하면 안되는게 맞다.

하지만, 개발자가 의도적으로 exception을 발생시킬 때가 있다.

 

왜 발생시킬까?

개발자가 의도하지 못한 상황이 발생하거나, 안드로이드 앱이 종료되는 것을 막기 위해 의도적으로 에러를 발생시켜 핸들링 하기 위해서로 알고있다. 틀렸거나, 더 명확한 이유가 있다면 댓글로 알려주세용 ㅎㅎ

 

어떻게 발생시킬까?

throw라는 것을 활용해서 의도적으로 exception을 발생시킨다.

private fun getUserInfo() {
        userInfo =
            intent.getParcelable("USER", User::class.java) ?: throw IllegalArgumentException(
                "뭐에요. 내 user 정보 돌려줘요"
            )
    }

 

발생시키면 끝?

그럴리가.

발생시키고 처리를 해주는게 좋다.

 

어떻게 처리를 할까?

1. try-catch-finally

가장 흔하고 대부분 아는 방법일 것이다.

try{
	에러가 발생할 가능성이 있는 코드
} catch(e: 에러 종류){
	에러 발생시 행동할 내용
} finally{
	에러든 아니든 실행시킬 내용
}

이렇게 위와 같은 방법으로 쓰면 되고, 아래는 내가 작성했던 예시다

private fun setUser() {
        lateinit var text: String

        try {
            getUserInfo()

            text = getString(R.string.LOGIN_SUCCESS)
        } catch (e: IllegalArgumentException) {
            moveLoginActivity()

            text = e.message.toString()
        } finally {
            makeToast(this, text)
        }
    }

 

2. runCatching

이 친구의 가장 큰 특징은 성공시 행동, 실패시 행동을 구분해서 실행시킬 수 있다는 것이다.

이게 많이 중요한가?

생각보다 중요하다.

위에 내가 적은 setUser를 예시로 보자.

try{} 내부에 getUserInfo()와 text의 값을 수정하는 내용 두가지가 들어가 있다.

그렇다면 text값 수정 코드는 성공시 행동으로 따로 빼줄 수 있게 된다.

이게 왜 중요할까?

내가 작성한 코드는 간단한 예시지만, 만약 내부에 다른 코드가 많이 있었다면?

혹시 거기서 에러가 발생하게 됐을때 getUserInfo에서 발생한건지, 아니면 다른데서 발생한건지 추적이 힘들어진다.

그렇기 때문에 따로 구분해 줄 수 있다.

성공시 행동과 실패시 행동이 명시적으로 구분되어있기 때문에 내 생각엔 가독성이 더 좋아지는 것 같다.

private fun setUser() {
        lateinit var text: String

        runCatching {
            getUserInfo()
        }.fold(
            onSuccess = { text = getString(R.string.LOGIN_SUCCESS)},
            onFailure = {e ->
                moveLoginActivity()

                text = e.message.toString()
            }
        ).also {
            makeToast(this, text)
        }
    }

이렇게 위에 내가 적었던 코드를 수정할 수 있다.

3. 궁금한점

SpringBoot에서는 @ExceptionHandler를 통해 간단하게 에러를 제어하는데 안드로이드는 그런게 없나요…?

매번하기 넘나리 귀찮은것

728x90
반응형