Sobes.tech
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, asynclaunch müxtəlif xətaların idarə olunması mexanizmlərinə malik fərqli coroutine-lər yaradır:

  • async geri qaytarır Deferred və onun içindəki xətalar await() çağırıldıqda yayılır.
  • launch nə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