Kotlin Coroutine: как перехватить исключение SocketTimeout в перехватчике - PullRequest
0 голосов
/ 07 января 2020

Я только начал использовать сопрограммы для 2 асинхронных c вызовов, которые выполняются параллельно. Одна из задач ayn c выполняет сервисный вызов. Эта услуга иногда может занять много времени, чтобы ответить. В этом случае мой код вызывает сбой в моей функции Interceptor, введенной кинжалом. Я пытался поймать ошибку и выбросить ее обратно в мою сопрограмму, но ее так и не поймали.

Сопрограмма:

    try {
                CoroutineScope(Dispatchers.IO).launch {

                    val deferredList = listOf(async {

                        myAPI?.getAllMarks(WebService.getAwsAccessToken(),
                                UserInfoManager?.userInfo?.guid)

                    }, async {

                        getClassFromJsonFile(R.raw.temp_whatsnew, WhatsNew::class.java)
                    })

                    var theList: List<Any> =
                            deferredList.awaitAll() // wait for all data to be processed without blocking the UI thread

                    withContext(Dispatchers.Main) {
                        mListener?.onWhatsNewDownloaded(theList.get(1) as WhatsNew,
                                theList.get(0) as List<Coachmark>)
                    }
                }
            } catch (t: Throwable) {
  //exception never reaches here!              
Log.v(WhatsNewInteractorImpl::class.java.simpleName, t.localizedMessage)

            }

Перехватчик:

try {
                response = chain.proceed(newRequest);
            } catch (SocketTimeoutException e) {
               //CRASHES HERE!
              throw new SocketTimeoutException("socket timeout");
            }

1 Ответ

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

Вам нужен CoroutineExceptionHandler:

private val coroutineExceptionHandler = CoroutineExceptionHandler{_ , throwable -> 
  //handle error here
}

someScope.launch(Dispatchers.IO + coroutineExceptionHandler){

}

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

Другие варианты:

scope.launch(Dispatchers.IO){
  try{
   //throwable operation
  }catch(e: SocketTimeOutException){

   }
}

Или вы можете просто забыть об обработке ошибок и реализовать сопрограммы метод withTimeOut

...