Sobes.tech
Junior — Middle

Cum diferă tratarea erorilor în interiorul coroutines folosind construcția try/catch față de utilizarea CoroutineExceptionHandler?

sobes.tech AI

Răspuns de la AI

În Kotlin, gestionarea erorilor în corutine poate fi realizată în două moduri: prin try/catch în interiorul corutinei și prin CoroutineExceptionHandler.

  • try/catch în interiorul corutinei permite capturarea locală a excepțiilor care apar în blocul de cod al corutinei. Este util atunci când doriți să tratați eroarea exact acolo unde poate apărea.

  • CoroutineExceptionHandler este un handler global de excepții pentru corutinele care se termină cu o eroare și nu au fost capturate local. Funcționează doar cu corutinele lansate cu launch (care returnează un Job), și nu cu async (care returnează un Deferred), deoarece async necesită o apelare explicită a await pentru a obține rezultatul și a trata excepțiile.

Exemplu:

val handler = CoroutineExceptionHandler { _, exception ->
    println("Excepție capturată în CoroutineExceptionHandler: $exception")
}

GlobalScope.launch(handler) {
    try {
        // Cod care poate arunca o excepție
        throw RuntimeException("Eroare în interiorul corutinei")
    } catch (e: Exception) {
        println("Capturat local: $e")
    }
}

Dacă excepția este capturată în try/catch, CoroutineExceptionHandler nu va fi activat. Dacă excepția nu este gestionată local, ea va fi trimisă la CoroutineExceptionHandler. Astfel, try/catch asigură gestionarea locală, iar CoroutineExceptionHandler este global și servește pentru logare sau alte acțiuni în cazul excepțiilor neprocesate.