함수가 원하는 경우를 만들 수 없는 경우
- 서버로 데이터를 읽어 들이려고 했는데, 인터넷 연결 문제로 읽어 들이지 못한경우
- 조건에 맞는 첫 번째 요소를 찾으려 했는데, 조건에 맞는 요소가 없는 경우
- 텍스트를 파싱해서 객체를 만들려고 했는데, 텍스트의 형식이 맞지 않는 경우
→ 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의 차이는 추가정보 전달 필요여부로 정한다.
참고
'Reading Record > 이펙티브 코틀린' 카테고리의 다른 글
[이펙티브 코틀린] Item9. use를 사용하여 리소스를 닫아라 (0) | 2022.04.19 |
---|---|
[이펙티브 코틀린] Item8. 적절하게 null을 처리하라 (0) | 2022.04.19 |
[이펙티브 코틀린] Item6. 사용자 정의 오류보다는 표준 오류를 사용하라 (0) | 2022.04.06 |
[이펙티브 코틀린] Item5. 예외를 활용해 코드에 제한을 걸어라 (0) | 2022.04.06 |
[이펙티브 코틀린] Item4. inferred 타입으로 리턴하지 말라 (0) | 2022.04.06 |