Sobes.tech
Junior — Middle

Πώς χειρίζεστε τις εξαιρέσεις κατά την εκκίνηση των κορουτινών χρησιμοποιώντας try/catch, τοποθετημένο έξω από τη λειτουργία launch;

sobes.tech AI

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

Στην Kotlin, οι εξαιρέσεις που συμβαίνουν μέσα σε κορυτίνες δεν μπορούν να πιαστούν με ένα απλό try/catch αν βρίσκονται εκτός της λειτουργίας launch, επειδή το launch ξεκινά την κορυτίνη ασύγχρονα και επιστρέφει αμέσως ένα αντικείμενο Job, και οι εξαιρέσεις συμβαίνουν ήδη σε ένα άλλο πλαίσιο.

Για να διαχειριστείτε τις εξαιρέσεις, πρέπει να χρησιμοποιήσετε χειριστές μέσα στην κορυτίνη ή ειδικούς μηχανισμούς:

  • Χρησιμοποιήστε CoroutineExceptionHandler κατά τη δημιουργία του πλαισίου της κορυτίνης.
  • Διαχειριστείτε τις εξαιρέσεις μέσα στην ίδια την κορυτίνη με try/catch.
  • Για τις κορυτίνες που ξεκινούν μέσω async, μπορείτε να πιάσετε την εξαίρεση καλώντας await().

Παράδειγμα με CoroutineExceptionHandler:

val handler = CoroutineExceptionHandler { _, exception ->
    println("Πιασμένη εξαίρεση: ${exception.message}")
}

val job = CoroutineScope(Dispatchers.Default + handler).launch {
    throw RuntimeException("Σφάλμα στην κορυτίνη")
}

job.join()

Έτσι, το try/catch έξω από το launch δεν θα λειτουργήσει, πρέπει να πιαστεί μέσα στην κορυτίνη ή να χρησιμοποιήσετε το CoroutineExceptionHandler.