Sobes.tech
Junior — Middle

Bude vykonanie async zrušené, ak je v ňom launch a dôjde k výnimke?

sobes.tech AI

Odpoveď od AI

V Kotlin Coroutines, ak v bloku async spustíte coroutine pomocou launch, výnimka, ktorá vznikne v launch, automaticky neukončí vykonávanie async.

Dôvodom je, že async a launch vytvárajú rôzne coroutine s rôznymi mechanizmami spracovania chýb:

  • async vracia Deferred a chyby v ňom budú odovzdané pri volaní await().
  • launch spúšťa coroutine, ktorá nevracia výsledok, a výnimky v nej sú spracovávané cez CoroutineExceptionHandler alebo vedú k zrušeniu nadradenej coroutine.

Ak je launch spustené vnútri async bez explicitného prepojenia s jeho Job, výnimka v launch nezruší async. Aby bolo zabezpečené zrušenie, je potrebné spustiť launch v rovnakom CoroutineScope alebo použiť SupervisorJob, alebo explicitne spracovať chyby.

Príklad:

val deferred = async {
    launch {
        throw Exception("Chyba v launch")
    }
    // vykonávanie async bude pokračovať
}

// Výnimka z launch neovplyvní `deferred`, pokiaľ nebude volané `await()`