언어/Kotlin
[EffectiveKotlin] 예외를 활용해 코드에 제한을 걸어라
원석💎-dev
2022. 3. 17. 14:07
반응형
1. require 블록
파라미터에 대한 제한을 걸때 사용
IllegalArgumentException 발생
fun find(points: List<Point>): List<T> {
require(points.isNotEmpty()) // 조건에 만족하지 않는다면, IllegalArgumentException
// IllegalArgumentException에 message를 넣고싶다면,
// require(points.isNotEmpty()) { "error Message" }로 메세지를 넘겨줄 수 있다.
.
.
.
}
2. check 블록
상태에 대한 제한을 걸때 사용
IllegalStateException을 발생
// 예제1
class Bank {
fun isOpen: Boolean = ...
fun find(points: List<Point>): List<T> {
check(isOpen)
.
.
.
}
// 예제2
class User {
val token: String?
.
.
.
fun getUser() {
checkNotNull(token)
.
.
.
}
}
3. nullability와 스마트 캐스팅
require와 check 블록을 통과하면 해당 조건은 이후로도 true인 것으로 간주한다.
- 스마트 캐스트
fun changeDress(person: Person) {
require(person.outfit is Dress)
val dress: Dress = person.outfit
}
- 언팩(unpack) 용도로 사용
fun sendEmail(person: Person) {
val email = requireNotNull(person.email)
.
.
.
}
require은 Unit을 리턴하기 때문에 unpack용도로 사용할 수 없다.
- Exception 없이 우아하게 함수 끝내기
fun sendEmail(person: Person) {
val email: String = person.email ?: return // 엘비스 연산자 사용
.
.
.
}
// 끝내기전 로그 남기기
fun sendEmail(person: Person) {
val email: String = person.email ?: run {
log("email is null")
return
}
.
.
.
}
4. assert 블록
실제 코드를 테스트 할 때만 동작 개인적으로는 비추
반응형