Sobes.tech
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()`