suspend fun main(): Unit = coroutineScope {
try {
launch {
throw NullPointerException()
repeat(10) {
println(it)
}
}
delay(1000)
println("끝")
delay(1000)
} catch(e: Exception) {
println("test")
}
}
coroutineScope
에선 해당 예외가 잡히지만, launch
블록에선 잡히지 않아NullPointerException가 발생하게됨.
suspend fun main(): Unit = coroutineScope {
try {
launch {
try {
throw NullPointerException()
repeat(10) {
println(it)
}
} catch (e: Exception) {
println("test1")
}
}
delay(1000)
println("끝")
delay(1000)
} catch(e: Exception) {
println("test")
}
}
launch
블록에도 try~catch를 사용한다면, 해당 블록에서 예외가 잡히므로 coroutineScope
(부모코루틴)까지 전파가 안됨.
SupervisorJob
을 사용하는 것.SupervisorJob
을 사용하면 자식에서 발생한 모든 예외를 무시할 수 있음.SupervisorJob
은 다수의 코루틴을 시작하는 스코프로 사용됨.fun main(): Unit = runBlocking {
launch(SupervisorJob()) {
launch {
delay(1000)
throw Error("Some error")
}
launch {
delay(2000)
println("Will not be printed")
}
}
delay(3000)
}
SupervisorJob
을 다음 코드처럼 부모 코루틴의 인자로 사용하는 것임.SupervisorJob
은 단 하나의 자식만 가지기 때문에 예외를 처리하는데 아무런 도움이 되지 않음.supervisorScope
로 래핑하는 것임.