Sobes.tech
Junior — Middle

Ինչպես է տարբերվում սխալների կառավարումը կորժիններում try/catch կառուցվածքի օգտագործմամբ և CoroutineExceptionHandler-ի օգտագործմամբ?

sobes.tech AI

Պատասխան AI-ից

Kotlin-ում սխալների կառավարումը կորուտիններում կարող է իրականացվել երկու եղանակով՝ try/catch-ի միջոցով կորուտինում և CoroutineExceptionHandler-ի միջոցով:

  • try/catch կորուտինում թույլ է տալիս տեղական բռնել այն արտահայտությունները, որոնք տեղի են ունենում կորուտինի կոդի բլոկում: Սա հարմար է, երբ ցանկանում եք անմիջապես այնտեղ, որտեղ կարող է տեղի ունենալ սխալը, այն կառավարել:

  • CoroutineExceptionHandler — դա գլոբալ արտակարգ իրավիճակների կառավարիչ է այն կորուտինների համար, որոնք ավարտվում են սխալով և չեն բռնվել տեղական։ Այն աշխատում է միայն launch-ով սկսված կորուտինների հետ (որոնք վերադարձնում են Job), ոչ թե async-ի հետ (որոնք վերադարձնում են Deferred), քանի որ async-ը պահանջում է բացահայտ await-ի կանչ, որպեսզի ստանա արդյունքը և կառավարի սխալները:

Օրինակ՝

val handler = CoroutineExceptionHandler { _, exception ->
    println("CoroutineExceptionHandler-ում բռնված արտահայտություն՝ $exception")
}

GlobalScope.launch(handler) {
    try {
        // Կոդ, որը կարող է արտահայտություն գցել
        throw RuntimeException("Սխալ կորուտինում")
    } catch (e: Exception) {
        println("Տեղական բռնում՝ $e")
    }
}

Եթե արտահայտությունը բռնվում է try/catch-ով, CoroutineExceptionHandler-ը չի գործի։ Եթե արտահայտությունը չի բռնվում տեղական, այն կանցնի CoroutineExceptionHandler-ին։ Այսպիսով՝ try/catch-ը ապահովում է տեղական կառավարում, իսկ CoroutineExceptionHandler-ը՝ գլոբալ և ծառայում է անբացառված արտահայտությունների համար լոգավորման կամ այլ գործողությունների համար։