KT Kotlin  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Отмена и обработка ошибок корутин

Тест разбирает отмену корутин как часть управления ресурсами, а не как особое исключение, которое можно бездумно перехватить. Вопросы затрагивают SupervisorJob, распространение сбоев, finally и ситуации, где очистка сама требует приостанавливаемого кода.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 5 тематических шкал.
Вопрос 1 из 25
Какой контракт определяет наблюдаемый результат «Suspend-очистка после отмены»?
KotlinОсвобождение ресурсов · Suspend-очистка после отмены
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch {
        try { awaitCancellation() }
        finally {
            withContext(NonCancellable) { delay(10); println("closed") }
        }
    }
    yield() // дочерняя корутина успевает войти в try
    job.cancelAndJoin()
}
Вопрос 2 из 25
Какое изменение лучше всего защищает границу «Виртуальное время и отмена poll»?
KotlinТестирование и инструменты · Виртуальное время и отмена poll
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*
suspend fun poll(read: suspend () -> Unit) {
    while (currentCoroutineContext().isActive) {
        read()
        delay(1_000)
    }
}
Вопрос 3 из 25
Какой дополнительный сценарий нужен для «Повторный throw отмены»?
Вопрос 4 из 25
Предложенная правка для «Независимые дети supervisorScope» звучит так: Применять supervision для независимых задач и определить отдельный канал наблюдения ошибки каждого ребёнка. Какой недостаток важнее обсудить?
Вопрос 5 из 25
Какое сообщение обработает `handler`?
KotlinОбработка исключений корутин · Handler для launch и async
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*

val handler = CoroutineExceptionHandler { _, e -> println(e.message) }
fun main() = runBlocking {
    val scope = CoroutineScope(SupervisorJob() + handler)
    scope.launch { error("launch") }.join()
    val d = scope.async { error("async") }
    runCatching { d.await() }
    scope.cancel()
}
Вопрос 6 из 25
Какой тест лучше всего защищает край контракта «Виртуальное время и отмена poll»?
Вопрос 7 из 25
Решение для «Повторный throw отмены»: Не ловить Throwable без отдельного пропуска CancellationException; в вычислительных циклах регулярно проверять active-состояние. Что в нём остаётся не бесплатным?
Вопрос 8 из 25
Как supervisorScope влияет на `b`?
KotlinНезависимые задачи SupervisorJob · Независимые дети supervisorScope
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*

fun main() = runBlocking {
    supervisorScope {
        val a = launch { error("boom") }
        val b = async { delay(20); 7 }
        a.join()
        println(b.await())
    }
}
Вопрос 9 из 25
Какое утверждение точнее всего объясняет поведение фрагмента «Handler для launch и async»?
KotlinОбработка исключений корутин · Handler для launch и async
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*

val handler = CoroutineExceptionHandler { _, e -> println(e.message) }
fun main() = runBlocking {
    val scope = CoroutineScope(SupervisorJob() + handler)
    scope.launch { error("launch") }.join()
    val d = scope.async { error("async") }
    runCatching { d.await() }
    scope.cancel()
}
Вопрос 10 из 25
Какой рефакторинг делает поведение «Suspend-очистка после отмены» предсказуемее?
KotlinОсвобождение ресурсов · Suspend-очистка после отмены
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch {
        try { awaitCancellation() }
        finally {
            withContext(NonCancellable) { delay(10); println("closed") }
        }
    }
    yield() // дочерняя корутина успевает войти в try
    job.cancelAndJoin()
}
Вопрос 11 из 25
Какие слова будут выведены?
KotlinОтмена корутин · Повторный throw отмены
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch {
        try { repeat(10) { delay(100) } }
        catch (e: CancellationException) { println("cancel"); throw e }
    }
    delay(10); job.cancelAndJoin(); println("joined")
}
Вопрос 12 из 25
Что в семантике Kotlin или используемого API объясняет «Независимые дети supervisorScope»?
KotlinНезависимые задачи SupervisorJob · Независимые дети supervisorScope
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*

fun main() = runBlocking {
    supervisorScope {
        val a = launch { error("boom") }
        val b = async { delay(20); 7 }
        a.join()
        println(b.await())
    }
}
Вопрос 13 из 25
Как укрепить «Handler для launch и async», не переписывая соседние модули?
KotlinОбработка исключений корутин · Handler для launch и async
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*

val handler = CoroutineExceptionHandler { _, e -> println(e.message) }
fun main() = runBlocking {
    val scope = CoroutineScope(SupervisorJob() + handler)
    scope.launch { error("launch") }.join()
    val d = scope.async { error("async") }
    runCatching { d.await() }
    scope.cancel()
}
Вопрос 14 из 25
Какой дополнительный сценарий нужен для «Suspend-очистка после отмены»?
Вопрос 15 из 25
В «Виртуальное время и отмена poll» выбрали решение: Добавить сценарий отмены во время read и убедиться, что CancellationException не перехватывается зависимостью. Какова его реальная цена?
Вопрос 16 из 25
Какая правка устраняет причину риска в «Независимые дети supervisorScope», а не только его проявление?
KotlinНезависимые задачи SupervisorJob · Независимые дети supervisorScope
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*

fun main() = runBlocking {
    supervisorScope {
        val a = launch { error("boom") }
        val b = async { delay(20); 7 }
        a.join()
        println(b.await())
    }
}
Вопрос 17 из 25
Где упрощённое объяснение «Handler для launch и async» перестаёт работать?
Вопрос 18 из 25
Решение для «Suspend-очистка после отмены»: Закрывать ресурсы через `use` или finally, задавать таймаут очистки и не выполнять в NonCancellable долгие сетевые операции. Что в нём остаётся не бесплатным?
Вопрос 19 из 25
Какой тест проверяет отменяемость без ожидания реальной секунды?
KotlinТестирование и инструменты · Виртуальное время и отмена poll
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*
suspend fun poll(read: suspend () -> Unit) {
    while (currentCoroutineContext().isActive) {
        read()
        delay(1_000)
    }
}
Вопрос 20 из 25
На какой контракт языка или библиотеки опирается «Повторный throw отмены»?
KotlinОтмена корутин · Повторный throw отмены
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch {
        try { repeat(10) { delay(100) } }
        catch (e: CancellationException) { println("cancel"); throw e }
    }
    delay(10); job.cancelAndJoin(); println("joined")
}
Вопрос 21 из 25
Предложенная правка для «Handler для launch и async» звучит так: Для async обрабатывать ошибку в месте await, а handler использовать для централизованной диагностики корневых fire-and-observe задач. Какой недостаток важнее обсудить?
Вопрос 22 из 25
Почему `closed` будет напечатано?
KotlinОсвобождение ресурсов · Suspend-очистка после отмены
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch {
        try { awaitCancellation() }
        finally {
            withContext(NonCancellable) { delay(10); println("closed") }
        }
    }
    yield() // дочерняя корутина успевает войти в try
    job.cancelAndJoin()
}
Вопрос 23 из 25
Какое правило определяет поведение фрагмента «Виртуальное время и отмена poll»?
KotlinТестирование и инструменты · Виртуальное время и отмена poll
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*
suspend fun poll(read: suspend () -> Unit) {
    while (currentCoroutineContext().isActive) {
        read()
        delay(1_000)
    }
}
Вопрос 24 из 25
Какую точечную правку стоит принять на ревью фрагмента «Повторный throw отмены»?
KotlinОтмена корутин · Повторный throw отмены
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch {
        try { repeat(10) { delay(100) } }
        catch (e: CancellationException) { println("cancel"); throw e }
    }
    delay(10); job.cancelAndJoin(); println("joined")
}
Вопрос 25 из 25
Где поведение «Независимые дети supervisorScope» требует отдельной проверки?

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу