Junior — Middle
Ще бъде ли отменено изпълнението на async, ако вътре има launch и възникне изключение?
sobes.tech AI
Отговор от AI
В Kotlin Coroutines, ако вътре в блок async се стартира корутина чрез launch, изключението, възникнало в launch, не ще анулира автоматично изпълнението на async.
Причината е, че async и launch създават различни корутини с различни механизми за обработка на грешки:
asyncвръщаDeferredи грешките вътре в него ще бъдат пренасочени при извикване наawait().launchстартира корутина, която не връща резултат, и изключенията в нея се обработват чрезCoroutineExceptionHandlerили водят до анулиране на родителската корутина.
Ако launch е стартиран вътре в async без явна връзка с неговия Job, изключението в launch няма да анулира async. За да се осигури анулиране, трябва да стартирате launch в същия CoroutineScope или да използвате SupervisorJob, или да обработвате грешките явно.
Пример:
val deferred = async {
launch {
throw Exception("Грешка в launch")
}
// изпълнението на async ще продължи
}
// Изключението от launch няма да повлияе на deferred, докато не бъде извикан `await()`