• [EffectiveKotlin] 예외를 활용해 코드에 제한을 걸어라
    언어/Kotlin 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 블록

    실제 코드를 테스트 할 때만 동작 개인적으로는 비추

    반응형

    댓글

Designed by Tistory.