Sobes.tech
Middle

Чӣ роҳҳои коркарди хато дар корутинҳоро медонед?

sobes.tech AI

Ҷавоб аз AI

  • Истифодаи блокҳои try...catch. Усули стандартии кор бо истисноот. Кор мекунад дар дохили корутин.

    // Истифодаи try-catch
    suspend fun fetchData(): String {
        return try {
            // Операсия, ки метавонад истисно барорад
            throw Exception("Хатогӣ дар боргирии маълумот")
            "Маълумот бо муваффақият боргирӣ шуд"
        } catch (e: Exception) {
            "Хатогӣ: ${e.message}"
        }
    }
    

    try...catch барои кор бо истисноот дар дохили корутин мувофиқ нест.

  • CoroutineExceptionHandler. Ҳамоҳангсозӣ бо истисноот, ки аз корутинҳои дар дохили он дар Scope-и муайян оғозшуда, баромадаанд.

    // CoroutineExceptionHandler
    val handler = CoroutineExceptionHandler { _, exception ->
        println("Ҳамоҳангсозӣ бо истисно: $exception")
    }
    
    // Истифодаи CoroutineExceptionHandler
    GlobalScope.launch(handler) {
        // Корутин, ки метавонад истисно барорад
        throw Exception("Хатогӣ дар корутин")
    }
    

    CoroutineExceptionHandler фаъол мешавад танҳо барои истиснооте, ки механизми шикастани сохторӣ кор намекунад.

  • SupervisorJob ва supervisorScope. Баръакс аз Job оддӣ, вақте ки корутинаи додар бо хато сабаб мешавад, ки Job-и падарӣ бекор шавад, SupervisorJob ин корро намекунад. supervisorScope як CoroutineScope бо SupervisorJob месозад.

    // Истифодаи supervisorScope
    suspend fun loadMultipleData() = supervisorScope {
        val data1 = async {
            // Мумкин аст истисно барорад
            throw Exception("Хатогӣ дар маълумот 1")
            "Маълумот 1"
        }
        val data2 = async {
            "Маълумот 2"
        }
    
        // Мумкин аст истисноро барои async-и мушаххас коркард кунад
        try {
            println("Натиҷа 1: ${data1.await()}")
        } catch (e: Exception) {
            println("Хатогӣ дар боргирии маълумот 1: ${e.message}")
        }
        println("Натиҷа 2: ${data2.await()}")
    }
    

    Ин барои вазифаҳои додарии мустақил истифода мешавад, ки хато дар яке дигар набояд ба дигарон таъсир расонад. Намебозад try...catch ё CoroutineExceptionHandler, балки рафторро дар шикастани истисноот тағйир медиҳад.

  • Тарафдории истисноот дар шикастани сохторӣ. Дар асос, истисно дар коруноти додар сабаби бекор шудани коруноти падар ва ҳамаи ҳамсояҳояш мешавад.

    // Намунаи тарафдории истисно
    runBlocking {
        val job = launch {
            launch { // Корутинӣ додар 1
                delay(100)
                throw Exception("Хатогӣ дар додар 1")
            }
            launch { // Корутинӣ додар 2
                delay(200)
                println("Додар 2 анҷом ёфт")
            }
        }
        try {
            job.join()
        } catch (e: Exception) {
            println("Ҳамоҳангсозӣ бо истисно дар падар: $e")
        }
    }
    

    Ин рафтори асосии шикастани сохторӣ аст, ки кӯмак мекунад, ки аз норасоиҳои захираҳо ва ҳолатҳо пешгирӣ шавад.

  • Истифодаи async бо await(). Истисноот, ки дар async баромадаанд, автоматӣ паҳн намешаванд. Онҳо дар дохили Deferred нигоҳ дошта мешаванд ва танҳо дар вақти даъвати await() ба вуҷуд меоянд.

    // Коркарди истисноот бо async/await
    suspend fun safeAsyncCall() = coroutineScope {
        val deferred = async {
            throw Exception("Хатогӣ дар async")
            "Натиҷаи async"
        }
    
        try {
            val result = deferred.await()
            println("Натиҷа: $result")
        } catch (e: Exception) {
            println("Ҳамоҳангсозӣ бо истисно: ${e.message}")
        }
    }
    

    Ин имкон медиҳад, ки хатоҳо барои ҳар як вазифаи асинхронӣ интихобӣ коркард шаванд.

Тасниф Нақшаи кор Оё кор мекунад бо истисноот? Оё тағйир медиҳад паҳншавӣ?
try...catch Кор бо истисноот дар дохили корутин Не Не
CoroutineExceptionHandler Ҳамоҳангсозӣ бо истисноот дар Scope Бале Не
SupervisorJob/Scope Тағйир додани рафтори паҳншавии истисноот Не Бале
Шикастани сохторӣ Автоматикӣ бекор кардан дар хато Бале Бале
async + await() Паёми паҳншавии истисноот дар вақти лозим Не Бале (то await)