Sobes.tech
Junior — Middle

Θα ακυρωθεί η εκτέλεση async αν μέσα σε αυτήν υπάρχει ένα launch και προκύψει εξαίρεση;

sobes.tech AI

Απάντηση από AI

Στα Kotlin Coroutines, αν μέσα σε ένα μπλοκ async ξεκινάει μια coroutine μέσω launch, η εξαίρεση που συμβαίνει στο launch δεν θα ακυρώσει αυτόματα την εκτέλεση του async.

Ο λόγος είναι ότι το async και το launch δημιουργούν διαφορετικές coroutines με διαφορετικούς μηχανισμούς διαχείρισης σφαλμάτων:

  • Το 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()`