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()`