Sobes.tech
Junior — Middle

Kā atšķiras kļūdu apstrāde korutīnās, izmantojot konstrukciju try/catch, no CoroutineExceptionHandler izmantošanas?

sobes.tech AI

Atbilde no AI

Kotlinā kļūdu apstrāde korutīnās var tikt veikta divos veidos: ar try/catch korutīnas iekšienē un ar CoroutineExceptionHandler.

  • try/catch korutīnas iekšienē ļauj lokāli noķert izņēmumus, kas rodas korutīnas koda blokā. Tas ir noderīgi, ja vēlaties tieši tur, kur var rasties kļūda, to apstrādāt.

  • CoroutineExceptionHandler ir globāls izņēmumu pārvaldnieks korutīnām, kas beidzas ar kļūdu un nav noķertas vietēji. Tas darbojas tikai ar launch uzsāktām korutīnām (kas atgriež Job), nevis ar async (kas atgriež Deferred), jo async prasa skaidru await izsaukumu rezultāta iegūšanai un kļūdu apstrādei.

Piemērs:

val handler = CoroutineExceptionHandler { _, exception ->
    println("Korutīnas `CoroutineExceptionHandler` noķerta kļūda: $exception")
}

GlobalScope.launch(handler) {
    try {
        // Kods, kas var izraisīt izņēmumu
        throw RuntimeException("Kļūda korutīnā")
    } catch (e: Exception) {
        println("Vietējā noķeršana: $e")
    }
}

Ja kļūda ir noķerta try/catch, CoroutineExceptionHandler netiks aktivizēts. Ja kļūda nav noķerta vietēji, tā tiks nosūtīta uz CoroutineExceptionHandler. Šādā veidā, try/catch nodrošina vietējo apstrādi, bet CoroutineExceptionHandler ir globāls un paredzēts neapstrādātu kļūdu reģistrēšanai vai citām darbībām.