Junior — Middle
Əgər içində launch olan və istisna baş verən bir halda async icrası ləğv ediləcəkmi?
sobes.tech Süni İntellekt
AI-dan cavab
Kotlin Coroutines-də, əgər async blokunun içində launch vasitəsilə coroutine başlatılırsa, launch-də yaranan istisna avtomatik olaraq async-in icrasını ləğv etməyəcək.
Səbəb odur ki, async və launch müxtəlif xətaların idarə olunması mexanizmlərinə malik fərqli coroutine-lər yaradır:
asyncgeri qaytarırDeferredvə onun içindəki xətalarawait()çağırıldıqda yayılır.launchnəticə verməyən coroutine başlatır və onun içindəki istisnalar CoroutineExceptionHandler vasitəsilə idarə olunur və ya ana coroutine-in ləğv olunmasına səbəb olur.
Əgər launch, async daxilində onun Job-u ilə açıq əlaqələndirilmədən başlatılırsa, launch-dəki istisna async-i ləğv etməyəcək. Ləğv etməni təmin etmək üçün, launch-ı eyni CoroutineScope daxilində başlatmaq və ya SupervisorJob istifadə etmək və ya xətaları açıq şəkildə idarə etmək lazımdır.
Nümunə:
val deferred = async {
launch {
Exception("launch-də xəta") at
}
// async davam edəcək
}
// launch-dən gələn istisna, `await()` çağırılmadıqca, deferred-ə təsir etməz