Sobes.tech
Junior — Middle

თუ მასში launch არის და გამონაკლისი ხდება, განახორციელებს თუ არა async გაუქმებას?

sobes.tech AI

პასუხი AI-სგან

Kotlin Coroutines-ებში, თუ async ბლოკის შიგნით launch-ის საშუალებით coroutine იწყება, მაშინ launch-ში მომხდარი გამონაკლისი ავტომატურად არ გააუქმებს async-ის შესრულებას.

მიზეზი ის არის, რომ async და launch ქმნიან სხვადასხვა coroutine-ებს, რომლებიც სხვადასხვა შეცდომების მართვის მექანიზმებს იყენებენ:

  • async აბრუნებს Deferred-ს და მისი შიგნით არსებული შეცდომები გადაეცემა await()-ის გამოძახებისას.
  • launch იწყებს coroutine-ს, რომელიც შედეგს არ აბრუნებს, და მისი შიგნით არსებული გამონაკლისები მართვადია CoroutineExceptionHandler-ის მეშვეობით ან იწვევს მშობელი coroutine-ის გაუქმებას.

თუ launch იწყება async-ის შიგნით, მისი Job-თან პირდაპირი კავშირი არ არის, მაშინ launch-ში გამონაკლისი არ გააუქმებს async-ს. იმისთვის, რომ გარანტირებული იყოს გაუქმება, საჭიროა launch-ის დაწყება იგივე CoroutineScope-ში ან SupervisorJob-ის გამოყენება ან გამონაკლისების მკაფიო მართვა.

მაგალითი:

val deferred = async {
    launch {
        throw Exception("launch-ში შეცდომა")
    }
    // async-ის შესრულება გაგრძელდება
}

// `launch`-დან გამონაკლისი არ იმოქმედებს `deferred`-ზე, სანამ არ გამოიძახება `await()`