Чӣ роҳҳои коркарди хато дар корутинҳоро медонед?
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) |