결과 부족이 발생할 경우 null과 failure를 사용하라

함수가 원하는 경우를 만들 수 없는 경우

서버로 데이터를 읽어 들이려고 했는데, 인터넷 연결 문제로 읽어 들이지 못한경우 조건에 맞는 첫 번째 요소를 찾으려 했는데, 조건에 맞는 요소가 없는 경우

텍스트를 파싱해서 객체를 만들려고 했는데, 텍스트의 형식이 맞지 않는 경우 → null or throw를 발생한다. 정보를 전달해야하는 상황에는 throw를 리턴하고, 추가 정보를 리턴해야하는 경우에는 sealed. 클래스를 사용한다.

정보를 전달해야 하는 경우 예외를 사용하면 안되는 이유

전파되는 과정 추적이 어려움 코틀린은 unchecked 예외만 존재하므로 예외처리에 자유도가 있음

try-catch 블록 내부에 코드를 배치하면 컴파일러 최적화 제한된다

예측이 가능한 오류 범위일 경우에는 null 과 Failure를 사용하고 어려운 예외적인 범위의 오류는 예외를 throw한다.

val random = Random()

fun someMethod(): Result<String> {
    val num = random.nextInt(5)
    return if (num == 1) {
        Failure(IllegalStateException())
    } else {
        Success("직업 성공")
    }
}

sealed class Result<out T>
class Success<out T>(val result: T) : Result<T>()
class Failure(val throwable: Throwable) : Result<Nothing>()

이렇게 Result와 같은 결과 봉투 클래스를 활용해 리턴하면 클라이언트 측에서 when 절을 활용해 결과를 처리하기 용이해지고, try-catch블록보다 효율적임

만약 null을 리턴하더라도 Elvis 연산자를 활용해 널 안정성 기능을 활용하여 처리가능

→ null과 sealed의 차이는 추가정보 전달 필요여부로 정한다.

Last updated