Ошибки в Kotlin
Исключение внутри корутины ведет себя как обычный
сбой: оно всплывает к точке, где корутину
запустили. Если runBlocking стоит в
main, блок try вокруг вызова
может перехватить ошибку до выхода из программы.
Намеренный сбой внутри launch прерывает
весь runBlocking, если его не обработать
внутри:
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
fun main() {
try {
runBlocking {
launch {
error("boom")
}
}
} catch (ex: IllegalStateException) {
println(ex.message)
}
println("alive")
}
Сообщение исключения попадает в catch,
затем печатается "alive". Поток
main не обрывается на необработанном
исключении.
Тот же прием работает, когда сбой бросают прямо
в теле runBlocking без фонового запуска:
import kotlinx.coroutines.runBlocking
fun main() {
try {
runBlocking {
val n = 0
val bad = 5 / n
println(bad)
}
} catch (_: ArithmeticException) {
println("fix input")
}
}
Внутри runBlocking вызовите стандартную
функцию ошибки с текстом "fail".
Оберните запуск в try снаружи и
напечатайте "handled" в обработчике.
Фоновая корутина бросает
IllegalArgumentException с сообщением
"bad id". Перехватите его вокруг
runBlocking и выведите сообщение
исключения.