Ловить исключения из разных областей возможно? - PullRequest
1 голос
/ 07 января 2020

Это как-то возможно?

scopeA.launch {
    try {
        scopeB.launch {
            throw SomeException()
        }
    } catch (e: SomeException) {
        // Want to catch here
    }
}

1 Ответ

0 голосов
/ 07 января 2020

Похоже, вы будете sh для противоречивых вещей: оба запускают параллельную сопрограмму и приостанавливает текущую работу до ее завершения, улавливая возможные исключения. Вы должны решить, что вы на самом деле хотите:

  1. Если вы хотите параллелизма, обработайте исключение в дочерней сопрограмме:

    scopeA.launch {
        launch(dispatcherB) {
            try {
                throw SomeException()
            } catch (e: SomeException) {
                // handle
            }
        }
    }
    
  2. Если вы не хотите этого, не launch сопрограмму, а вместо этого используйте withContext(dispatcherB):

    scopeA.launch {
        try {
            withContext(dispatcherB) {
                throw SomeException()
            }
        } catch (e: SomeException) {
            // handle
        }
    }
    
  3. Если вы буквально хотите, чтобы две сопрограммы с разделенными жизненными циклами общались, вы должен ввести также разъединенный механизм связи. Например, вы можете установить Channel<SomeException> или Flow<SomeException>.

...