Я не могу выполнить обработку ошибок в сопрограммах.Я читал много статей и документацию по обработке исключений , но я не могу заставить ее работать.
Вот мои настройки:
Мой ViewModel
запускает сопрограмму с ее областью действия
class MyViewModel(private var myUseCase: MyUseCase) : ViewModel() {
private val viewModelJob = Job()
private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)
fun doSomething() {
uiScope.launch {
try {
myUseCase()
} catch (exception: Exception) {
// Do error handling here
}
}
}
}
My UseCase
просто обрабатывает несколько логику, и в этом случае некоторый валидатор
class MyUseCase(private val myRepository: MyRepository) {
suspend operator fun invoke() {
if (checker()) {
throw CustomException("Checker Failed due to: ...")
}
myRepository.doSomething()
}
}
Тогда мой Repository
просто обрабатываетсетевой уровень / локальный уровень
object MyRepository {
private val api = ... // Retrofit
suspend fun doSomething() = api.doSomething()
}
А вот мой интерфейс Retrofit
interface MyInterface {
@POST
suspend fun doSomething()
}
Try / catch из ViewModel
может обработать ошибку при вызове Retrofit, однако может:не поймать ошибку от CustomException
, выданного UseCase
.Из статей, которые я читал, это должно работать.Если я использую async
, я могу сделать await
и использовать ошибку, но мне не нужно использовать async
в этом случае, и я обдумывал это.Я могу заблудиться.
Любая помощь будет принята с благодарностью!Заранее спасибо!
Редактировать:
Вот журнал ошибок, который я получаю:
com.example.myapp.domain.errors.CustomException
at com.example.myapp.domain.FeatureOne$invoke$2.invokeSuspend(FeatureOne.kt:34)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:238)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594)
at kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:742)
Ошибка прямо указывает на явный оператор throw
.