포스트

코틀린 심화9 - try 식과 runCatching

try-catch

코틀린에서 try-catch 문을 사용 시에 catch문의 마지막 줄을 반환 값으로 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
fun getStr(): Nothing = throw Exception("예외 발생 기본 값으로 초기화")

fun main() {
  val result = try {
    getStr() // 예외 발생
  } catch (e: Exception) {
    println(e.message)
    "기본 값" // catch문의 마지막 줄은 반환값
  }

  println(result) // 기본 값
}

runCatching

코틀린에서 runCatching 함수 내에서 로직을 실행하면 예외발생 시, try-catch 문을 사용하지 않아도 원하는 반환 값을 지정해 줄 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
fun getStr(): Nothing = throw Exception("예외 발생 기본 값으로 초기화")

fun main() {
  // 예외 발생 시 null 반환
  var result: Any? = runCatching { getStr() }
    .getOrNull()

  // 예외 발생 시 함수의 결과를 반환
  result = runCatching { getStr() }
    .getOrElse {
      println(it.message)
      "기본 값2"
    }

  // 예외 발생 시 정해진 값 반환
  result = runCatching { getStr() }
    .getOrDefault("기본 값3")

  // 바로 예외를 발생
  result = runCatching { getStr() }
    .getOrThrow()

  // 예외 발생 시 예외 객체 반환(성공 시 null)
  result = runCatching { getStr() }
    .exceptionOrNull()

  // map 함수 내부에서 예외 발생 시 다음 함수가 실행되지 않고 예외발생.
  // mapCatching을 사용하면 예외를 반환하거나 다음 함수를 실행.
  result = runCatching { "안녕하세요" }
    //  .map { throw Exception("예외 발생") } // 예외발생 시 다음 함수 실행X. 예외 발생
    .mapCatching { throw Exception("예외 발생") }
    .getOrDefault("기본 값")

  // recover는 runCatching 함수에서 예외가 발생했을 때 대체할 값을 지정
  // recoverCatching을 사용하면 예외를 반환하거나 다음 함수를 실행.
  result = runCatching { getStr() }
    //  .recover { throw Exception("예외") } // 람다 안에서 던진 예외가 그대로 전파된다
    .recoverCatching { throw Exception("예외") }
    .getOrNull()
}

위와 같이 코틀린에서는 runCatching 함수 내에서 예외발생 시 필요한 반환 값을 지정할 수 있다. map, recover는 변환 람다 안에서 던진 예외를 그대로 전파하므로, 그 예외까지 Result로 감싸려면 mapCatching, recoverCatching을 사용하여 처리해줘야 한다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.