코틀린 고급 예외처리

짱구·2023년 3월 25일
2

kotlin

목록 보기
6/8
post-thumbnail

고급 예외처리

코틀린은 자바의 try-catch-resources 구문을 제공하지 않지만 use라는 확장 함수를 제공합니다.

FileWriter("test.txt").use {
	it.write("Hello Kotlin")
}

runCatching을 사용

코틀린은 try-catch를 통한 예외처리 이외에도 함수형 스타일의 Result 패턴을 구현한 runCatching 을 제공합니다.
Result 패턴이란 함수가 성공하면 캡슐화된 결과를 반환하거나 예외가 발생하면 지정한 작업을 수행하는 패턴입니다.

  • 오류 메서드
fun getStr(): Nothing = throw Exception("예외 발생 기본 값으로 초기화")
  • try-catch 사용
fun main() {
    val result = try {
        getStr()
    } catch (e: Exception) {
        println(e.message)
        "기본값"
    }
    println(result)
    // 예외 발생 기본 값으로 초기화
	// 기본값
}
  • runCatching 사용
val result2 = runCatching { getStr() }
        .getOrElse {
            println(it.message)
            "기본값"
        }
println(result2)
// 예외 발생 기본 값으로 초기화
// 기본값

Result의 다양한 기능

  • getOrNull : 실패인 경우 null을 반환
val result3 = runCatching { getStr() }
        .getOrNull()
        
println(result3)
// null반환
  • exceptionOrNull : 성공인 경우 null을 반환하고 실패인 경우 Throwable을 반환
val result3: Throwable? = runCatching { getStr() }
        .exceptionOrNull()
result3?.let {
    println(it.message)
    throw it
}
  • getOrDefault : 성공시엔 성공 값을 반환하고 실패시엔 지정한 기본 값을 반환
val result3 = runCatching { getStr() }
        .getOrDefault("기본 값")
println(result3)
// 기본 값
  • getOrElse : 실패시 수신자 객체로 Throwable을 전달 받고 let, run과 같이 함수의 결과를 반환
val result3 = runCatching { getStr() }
        .getOrElse {
            println(it.message)
            "기본 값"
        }
        
println(result3)
// 예외 발생 기본 값으로 초기화
// 기본 값
  • getOrThrow : 성공시엔 값을 반환 실패시엔 예외를 발생시킨다
val result3 = runCatching { getStr() }
        .getOrThrow()
// Exception in thread "main" java.lang.Exception: 예외 발생 기본 값으로 초기화

map : 성공인 경우 원하는 값으로 변경

val result3 = runCatching { "안녕" }
        .map {
            it + "하세요"
        }.getOrThrow()
        
println(result3)
// 안녕하세요
  • mapCatching : map처럼 성공인 경우 원하는 값으로 변경, 변경 도중 예외가 발생하면 재처리
  • map에서 예외가 발생한 경우
val result3 = runCatching { "안녕" }
        .map {
            getStr()
        }.getOrDefault("기본값")
        
println(result3)
// Exception in thread "main" java.lang.Exception: 예외 발생 기본 값으로 초기화
  • mapCatching에서 예외가 발생한 경우
val result3 = runCatching { "안녕" }
        .mapCatching {
            getStr()
        }.getOrDefault("기본값")
        
println(result3)
// 기본값
  • recover : map은 성공시에 원하는 값으로 변경하지만 recover는 실패시에 원하는 값으로 변경
val result3 = runCatching { "정상" } // 성공시
        .recover {
            "복구"
        }.getOrNull()
        
println(result3)
// 정상

val result3 = runCatching { getStr() } // 실패시
        .recover {
            "복구"
        }.getOrNull()
        
println(result3)
// 복구
  • recoverCatching : recoverCatching 내에서 예외가 발생할 경우 재처리 가능!
  • recover에서 예외가 발생한 경우
val result3 = runCatching { getStr() }
        .recover {
            getStr()
        }.getOrDefault("복구")

println(result3)
// Exception in thread "main" java.lang.Exception: 예외 발생 기본 값으로 초기화
  • recoverCatching에서 예외가 발생한 경우
val result3 = runCatching { getStr() }
        .recoverCatching {
            getStr()
        }.getOrDefault("복구")
        
println(result3)
// 복구

출처 : fastcampus

profile
코드를 거의 아트의 경지로 끌어올려서 내가 코드고 코드가 나인 물아일체의 경지

2개의 댓글

comment-user-thumbnail
2024년 2월 23일

좋은 글 감사합니다~

1개의 답글