Корутинада каталардын иштетүү жолдорун билесизби?
sobes.tech AI
AIден жооп
-
Колдонуунун
try...catchблоктору. Стандарттык ыраазычылык ыкмасы. Корутиндин ичинде иштейт.// try-catch колдонуу suspend fun fetchData(): String { return try { // Исключение чыгара турган операция throw Exception("Маалыматты жүктөө ката") "Маалымат ийгиликтүү жүктөлдү" } catch (e: Exception) { "Ката: ${e.message}" } }try...catchбашкаCoroutineScopeичинде иштетилген балдар корутиналардан чыккан чыгымдарды иштетүү үчүн ылайыктуу эмес. -
CoroutineExceptionHandler. Бул иштетилбеген чыгымдарды кармайт, алар ушулCoroutineScopeже анын балдары тарабынан иштетилген корутиналардан чыгат.// CoroutineExceptionHandler val handler = CoroutineExceptionHandler { _, exception -> println("Кармалган чыгым: $exception") } // CoroutineExceptionHandler колдонуу GlobalScope.launch(handler) { // Чыгым чыгара турган корутина throw Exception("Корутинда ката") }CoroutineExceptionHandlerгана иштетилбеген чыгымдар үчүн иштейт, структураланган атаандаштык механизми тарабынан иштетилбеген. -
SupervisorJobжанаsupervisorScope. БулJob-дан айырмаланып, балдар корутинанын катага учурашы ата-энесининJob-ун жок кылууга алып келбейт.supervisorScopeSupervisorJobмененCoroutineScopeтүзөт.// 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("Async чыгымын кармоо: ${e.message}") } }Бул ар бир асинхрондуу тапшырма үчүн каталарды тандоого мүмкүндүк берет.
| ыкма | максаты | не иштейт? | өзгөртөт па таралышын? |
|---|---|---|---|
try...catch |
ички корутинда чыгымдарды иштетүү | Жок | Жок |
CoroutineExceptionHandler |
Scope ичинде иштетилбеген чыгымдарды кармоо | Ооба | Жок |
SupervisorJob/Scope |
чыгымдардын таралышын өзгөртүү | Жок | Ооба |
| Структураланган атаандаштык | катанын учурунда автоматтык жок кылуу | Ооба | Ооба |
async + await() |
чыгымдардын кечиктирилген таралышы | Жок | Ооба (await чейин) |