실무 프로젝트로 배우는 Kotlin & Spring/코틀린 고급

고급 예외처리

webmaster 2022. 10. 22. 21:21
728x90

Use

public class Java_TryWithResources {

  public static void main(String[] args) {
    try (FileWriter writer = new FileWriter("test.txt")) {
      writer.write("Hello Java");
    } catch (IOException e) {
      System.out.println(e.getMessage());
    }
  }

}
  • 자바 7 이상부터는 try-with-resources 구문을 사용하면, 자동으로 리소스를 close 처리해준다. 
  • try에 전달할 수 있는 자원은 AutoCloseable 인터페이스의 구현체로 한정
    • Closable or AutoClosable 인터페이스 구현체에 대해서만, close메서드를 호출

Kotlin

fun main() {
    FileWriter("test.txt")
        .use {
            //use 내부적으로 finally 안에 close가 호출되도록 되어있다.
            it.write("Hello Kotlin")
        }
}
  • kotlin에서는 use라는 확장 함수를 통해, try-catch-resources를 대체한다.

runCatching

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

fun getStr(): Nothing = throw Exception("예외 발생 기본 값으로 초기화")

fun main() {
    /*
    val result = try {
        getStr()//항상 예외 발생
    } catch (e: Exception) {
        println(e.message)
        "기본값"
    }
    println(result)
     */
    //runCatching을 사용하면, try-catch문을 더욱 우아하게 작성할 수 있다.
    /*
    val result = runCatching { getStr() }
        .getOrElse {
            println(it.message)
            "기본값"
        }
     */
    /*
    val result = runCatching { getStr() }
        //.getOrNull() //성공 = 값, 실패(예외) = null 반환
        //.exceptionOrNull() //성골 = null, 실패 = 예외 반환
        //.getOrDefault("기본 값") //성공 = 값, 실패 = 디폴트값 반환
        .getOrElse { //성공 = 값, 실패시, it로 예외를 받아 함수의 결과를 반환한다.
            println(it.message)
            "기본 값"
        }
     */
    /*
    val result = runCatching { "안녕" }
        //.getOrThrow() //성공 = 값, 실패 = 예외
        .map { //Success로 감싸진 값에 새로운 값을 넣을 수가 있다
            "${it}하세요"
        }.getOrThrow()
     */
    val result = runCatching { "안녕" }
        /*
        .map {
            throw Exception("예외")
        }.getOrDefault("기본값") //map 안에서 발생한 예외는 getOrDefault 로 복구하려구 해도 안된다.
         */
        /*
        .mapCatching {
            throw Exception("예외")
        }.getOrDefault("기본 값")
         */
        /*
        .recover { "복구" } //성공시에 동작하지 않고, 실패할 경우 recover가 동작한다.
        .getOrNull()
         */
        .recoverCatching {
            throw Exception("예와")
        }.getOrDefault("기본 값")
    /*
    result?.let {
        println(it.message)
        throw it
     */
    println(result)
}
  • runCatching 내부에서는 Result 내부 동반 객체에서, 성공 상태/실패 상태에 따라 Result를 생성하고 있다.
  • Result를 사용해서 여러가지 기능을 사용할 수 있다.
    • getOrNull : 실패인 경우 null 반환
    • execeptionOrNull : 성공인 경우 null 반환 / 실패인 경우 Throwable을 반환
    • getOrDefault : 성공인 경우 성공 값 반환 / 실패인 경우 지정한 기본 값을 반환
    • getOrElse : 실패인 경우, 수신자 객체로 Throwable을 전달받고, let, run과 같이 함수의 결과를 반환
    • getOrThrow : 성공인 경우 성공 값을 반환 / 실패인 경우 예외를 발생
    • map : 성공인 경우 원하는 값으로 변경
    • mapCatching : map 내에서 예외가 발생할 경우 재처리 가능
    • recover : 실패할 경우 원하는 값으로 변경
    • recoverCatching : recover 내에서 예외가 발생할 경우 재처리 가능
728x90

'실무 프로젝트로 배우는 Kotlin & Spring > 코틀린 고급' 카테고리의 다른 글

람다로 프로그래밍하기  (0) 2022.10.22
스코프 함수  (0) 2022.10.22
페어와 구조분해할당  (0) 2022.10.16
지연 초기화  (0) 2022.10.16
제네릭  (0) 2022.10.16