본문은 Effective Kotlin을 읽고 간단하게 정리한 글입니다. 필요에 따라 생략/수정된 부분이 있을 수 있으며, 내용이 추후 변경될 수 있습니다.
1. 예외는 반드시 예외적인 상황에서만 사용하라
함수가 원하는 결과를 만들어 내지 않는 상황이 있다. 이럴 때는 보통 다음 두 가지 중 하나를 선택하게 된다.
책에서는 첫 번째 방법을 권고한다.
- null 또는 실패를 나타내는 sealed class(=Failure)를 반환한다 → 이것을 사용하라!
- 예외를 throw한다
예외를 throw 하는 것은 다음과 같은 단점이 있다.
- 디버깅이 까다롭다
- 사용자가 예상치 못한 동작이 발생할 수 있으며, 이것이 문서로 드러나지 않을 수 있다
- try-catch(또는 runCatching)를 사용하면 가독성이 떨어지고 유지보수에 좋지 않다
따라서 불필요한 예외를 throw하기 보다는 null과 sealed class(=Failure)를 적절하게 사용하자.
기본적으론 null을 사용하고, getOrNulll() 형태의 함수를 추가로 제공하거나 Elvis 연산자를 이용해 처리하면 된다.
// 1) getOrNull
fun get(id: Long): Entity
fun getOrNull(id: Long): Entity? // 추가로 제공
// 2) Elvis operator
get(1L) ?: return Entity(..)
추가적인 정보를 전달해야 할 땐 sealed class를 사용하면 된다.
sealed class는 상속받는 자식 클래스의 종류를 제한하는 추상클래스이다.
여기에 정리가 잘 되어 있으니 참고하자.
val person = userText.readObjectOrNull<Person>()
val age = when(person) {
is Success -> person.age
is Failure -> -1
}
해당 내용을 잘 정리해둔 글이 있는데, 읽어보는 것을 추천한다.
https://medium.com/@galcyurio/kotlin에서의-예외-처리-방법-48a5cd94a4e6
Kotlin에서의 예외 처리 방법
최근 몇 년간 교육 기관에서 코드 리뷰를 진행하면서 대부분의 리뷰이들이 예외 처리를 잘못 알고 구현하는 경우들을 많이 보았습니다.
medium.com
'책 > Effective Kotlin' 카테고리의 다른 글
[이펙티브 코틀린] 아이템9: use를 사용하여 리소스를 닫아라 (0) | 2023.07.04 |
---|---|
[이펙티브 코틀린] 아이템8: 적절하게 null을 처리하라 (0) | 2023.07.04 |
[이펙티브 코틀린] 아이템5: 예외를 활용해 코드에 제한을 걸어라 (0) | 2023.07.03 |
[이펙티브 코틀린] 아이템4: inferred 타입으로 리턴하지 말자 (0) | 2023.07.02 |
[이펙티브 코틀린] 아이템3: 최대한 플랫폼 타입을 사용하지 말라 (0) | 2023.07.01 |
본문은 Effective Kotlin을 읽고 간단하게 정리한 글입니다. 필요에 따라 생략/수정된 부분이 있을 수 있으며, 내용이 추후 변경될 수 있습니다.
1. 예외는 반드시 예외적인 상황에서만 사용하라
함수가 원하는 결과를 만들어 내지 않는 상황이 있다. 이럴 때는 보통 다음 두 가지 중 하나를 선택하게 된다.
책에서는 첫 번째 방법을 권고한다.
- null 또는 실패를 나타내는 sealed class(=Failure)를 반환한다 → 이것을 사용하라!
- 예외를 throw한다
예외를 throw 하는 것은 다음과 같은 단점이 있다.
- 디버깅이 까다롭다
- 사용자가 예상치 못한 동작이 발생할 수 있으며, 이것이 문서로 드러나지 않을 수 있다
- try-catch(또는 runCatching)를 사용하면 가독성이 떨어지고 유지보수에 좋지 않다
따라서 불필요한 예외를 throw하기 보다는 null과 sealed class(=Failure)를 적절하게 사용하자.
기본적으론 null을 사용하고, getOrNulll() 형태의 함수를 추가로 제공하거나 Elvis 연산자를 이용해 처리하면 된다.
// 1) getOrNull
fun get(id: Long): Entity
fun getOrNull(id: Long): Entity? // 추가로 제공
// 2) Elvis operator
get(1L) ?: return Entity(..)
추가적인 정보를 전달해야 할 땐 sealed class를 사용하면 된다.
sealed class는 상속받는 자식 클래스의 종류를 제한하는 추상클래스이다.
여기에 정리가 잘 되어 있으니 참고하자.
val person = userText.readObjectOrNull<Person>()
val age = when(person) {
is Success -> person.age
is Failure -> -1
}
해당 내용을 잘 정리해둔 글이 있는데, 읽어보는 것을 추천한다.
https://medium.com/@galcyurio/kotlin에서의-예외-처리-방법-48a5cd94a4e6
Kotlin에서의 예외 처리 방법
최근 몇 년간 교육 기관에서 코드 리뷰를 진행하면서 대부분의 리뷰이들이 예외 처리를 잘못 알고 구현하는 경우들을 많이 보았습니다.
medium.com
'책 > Effective Kotlin' 카테고리의 다른 글
[이펙티브 코틀린] 아이템9: use를 사용하여 리소스를 닫아라 (0) | 2023.07.04 |
---|---|
[이펙티브 코틀린] 아이템8: 적절하게 null을 처리하라 (0) | 2023.07.04 |
[이펙티브 코틀린] 아이템5: 예외를 활용해 코드에 제한을 걸어라 (0) | 2023.07.03 |
[이펙티브 코틀린] 아이템4: inferred 타입으로 리턴하지 말자 (0) | 2023.07.02 |
[이펙티브 코틀린] 아이템3: 최대한 플랫폼 타입을 사용하지 말라 (0) | 2023.07.01 |