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를 통해 간단하게 에러를 제어하는데 안드로이드는 그런게 없나요…?
매번하기 넘나리 귀찮은것