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. -
CoroutineExceptionHandlereste 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 culaunch(care returnează unJob), și nu cuasync(care returnează unDeferred), deoareceasyncnecesită o apelare explicită aawaitpentru 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.