Πώς διαφέρει η διαχείριση σφαλμάτων μέσα σε coroutines με τη χρήση της κατασκευής try/catch από τη χρήση του CoroutineExceptionHandler;
sobes.tech AI
Απάντηση από AI
Στην Kotlin, η διαχείριση σφαλμάτων στις κορυτίνες μπορεί να πραγματοποιηθεί με δύο τρόπους: μέσω try/catch μέσα στην ίδια την κορυτίνη και μέσω CoroutineExceptionHandler.
-
try/catchμέσα στην κορυτίνη επιτρέπει την τοπική πιάσιμο των εξαιρέσεων που συμβαίνουν στο μπλοκ κώδικα της κορυτίνης. Είναι χρήσιμο όταν θέλετε να χειριστείτε το σφάλμα ακριβώς εκεί που μπορεί να προκύψει. -
CoroutineExceptionHandlerείναι ένας παγκόσμιος διαχειριστής εξαιρέσεων για τις κορυτίνες που τελειώνουν με σφάλμα και δεν έχουν πιαστεί τοπικά. Λειτουργεί μόνο με κορυτίνες που ξεκινούν μεlaunch(που επιστρέφουν έναJob), και όχι μεasync(που επιστρέφουν έναDeferred), καθώς τοasyncαπαιτεί ρητή κλήσηawaitγια την απόκτηση του αποτελέσματος και τη διαχείριση των σφαλμάτων.
Παράδειγμα:
val handler = CoroutineExceptionHandler { _, exception ->
println("Πιάστηκε εξαίρεση στο CoroutineExceptionHandler: $exception")
}
GlobalScope.launch(handler) {
try {
// Κώδικας που μπορεί να ρίξει εξαίρεση
throw RuntimeException("Σφάλμα μέσα στην κορυτίνη")
} catch (e: Exception) {
println("Τοπικά πιασμένο: $e")
}
}
Αν η εξαίρεση πιαστεί στο try/catch, το CoroutineExceptionHandler δεν θα ενεργοποιηθεί. Αν η εξαίρεση δεν διαχειριστεί τοπικά, θα περάσει στο CoroutineExceptionHandler. Με αυτόν τον τρόπο, το try/catch παρέχει τοπική διαχείριση, ενώ το CoroutineExceptionHandler είναι παγκόσμιο και χρησιμοποιείται για καταγραφή ή άλλες ενέργειες σε περίπτωση μη διαχειριζόμενων εξαιρέσεων.