Sobes.tech
Junior — Middle

Kuidas erineb vigade käsitlemine korutinates, kasutades konstruktsiooni try/catch, CoroutineExceptionHandler kasutamisest?

sobes.tech AI

Vastus AI-lt

Kohal, Kotlinis võib vigade käsitlemine korutinates toimuda kahel viisil: kasutades try/catch korutina enda sees ja CoroutineExceptionHandler abil.

  • try/catch korutina sees võimaldab kohalikult püüda erandeid, mis tekivad korutina koodiplokis. See on kasulik, kui soovite viga otse seal, kus see võib juhtuda, töödelda.

  • CoroutineExceptionHandler on globaalne erandite käsitleja korutinatele, mis lõpevad veaga ja ei ole kohapeal püüdsid. See töötab ainult launch-iga käivitatud korutinatega (mis tagastavad Job), mitte async-iga (mis tagastavad Deferred), kuna async nõuab selget await-i, et saada tulemust ja töödelda erandeid.

Näide:

val handler = CoroutineExceptionHandler { _, exception ->
    println("CoroutineExceptionHandler'is püütud erand: $exception")
}

GlobalScope.launch(handler) {
    try {
        // Kood, mis võib visata erandi
        throw RuntimeException("Viga korutinas")
    } catch (e: Exception) {
        println("Kohapeal püütud: $e")
    }
}

Kui erand on püütud try/catch-iga, siis CoroutineExceptionHandler ei aktiveeru. Kui erand ei ole kohapeal käsitsetud, saadetakse see CoroutineExceptionHandler-ile. Nii tagab try/catch kohapealse töötlemise, samas kui CoroutineExceptionHandler on globaalne ja seda kasutatakse logimiseks või muude toimingute jaoks käsitlemata erandite korral.