Sobes.tech
Junior — Middle

Hogyan különbözik a hibakezelés a coroutine-okon belül a try/catch szerkezet használatától a CoroutineExceptionHandler használatához képest?

sobes.tech MI

Válasz az MI-től

Kotlinban a hibakezelés a korutinokban két módon történhet: try/catch segítségével a korutinon belül, és CoroutineExceptionHandler segítségével.

  • try/catch a korutinon belül lehetővé teszi, hogy helyben elfogd azokat a kivételeket, amelyek a korutin kódblokkjában fordulnak elő. Ez akkor hasznos, ha közvetlenül ott akarod kezelni a hibát, ahol az keletkezhet.

  • CoroutineExceptionHandler egy globális kivételkezelő a hibával végződő, és helyben nem elfogott korutinok számára. Csak launch-szal indított korutinokkal működik (amelyek Job-ot adnak vissza), nem async-szal (amelyek Deferred-et adnak vissza), mivel az async-nak explicit await hívásra van szüksége az eredmény megszerzéséhez és a kivételek kezeléséhez.

Példa:

val handler = CoroutineExceptionHandler { _, exception ->
    println("Kivétel elfogva a CoroutineExceptionHandler-ben: $exception")
}

GlobalScope.launch(handler) {
    try {
        // Kód, ami kivételt dobhat
        throw RuntimeException("Hiba a korutinban")
    } catch (e: Exception) {
        println("Helyben elfogva: $e")
    }
}

Ha a kivétel helyben, try/catch-ben van elfogva, akkor a CoroutineExceptionHandler nem fog működni. Ha a kivétel nem kerül helyben kezelésre, akkor a CoroutineExceptionHandler-hez kerül. Így a try/catch helyi kezelést biztosít, míg a CoroutineExceptionHandler globális, és a nem kezelt kivételek naplózására vagy más műveletekre szolgál.