Junior — Middle
Как да обработим изключения при стартиране на корутини с помощта на try/catch, поставен извън функцията launch?
sobes.tech AI
Отговор от AI
В Kotlin изключенията, които възникват вътре в корутините, не могат да бъдат уловени с обикновен try/catch, ако са поставени отвън на функцията launch, защото launch стартира корутината асинхронно и веднага връща обект Job, а изключенията вече се случват в друг контекст.
За да обработите изключенията, трябва да използвате обработчици вътре в корутината или специални механизми:
- Използвайте
CoroutineExceptionHandlerпри създаването на контекста на корутината. - Обработвайте изключенията вътре в самата корутина с try/catch.
- За корутините, стартирани чрез
async, можете да уловите изключението при извикване наawait().
Пример с CoroutineExceptionHandler:
val handler = CoroutineExceptionHandler { _, exception ->
println("Уловена изключение: ${exception.message}")
}
val job = CoroutineScope(Dispatchers.Default + handler).launch {
throw RuntimeException("Грешка в корутината")
}
job.join()
По този начин, try/catch извън launch няма да работи, трябва да го уловите вътре в корутината или да използвате CoroutineExceptionHandler.