В моем приложении.Я пытаюсь отправить сетевой запрос, используя Kotlin Coroutines .Я проанализировал ответ и сгенерировал исключение для некоторой ситуации. Вот код:
class ProxyErrorInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
val response = chain.proceed(request)
val bodyString = response.body()?.string()
when (response.code()) {
HttpURLConnection.HTTP_OK -> {
val error = Gson().fromJson(bodyString, BusinessModel::class.java)
if (error.errorCode != null) {
throw BusinessDataException(error.errorCode, error.errorMessage)
}
}
HttpURLConnection.HTTP_INTERNAL_ERROR -> {
val error = Gson().fromJson(bodyString, BusinessModel::class.java)
if (error.errorCode != null) {
throw BusinessDataException(error.errorCode, error.errorMessage)
}
}
}
return response.newBuilder()
.body(ResponseBody.create(response.body()?.contentType(), bodyString)).build()
}
}
Это исключение перехвата.
fun getAccounts() {
try {
val myJob = GlobalScope.launch(Dispatchers.IO) {
val response = interactor.getAccounts()
launch(Dispatchers.Default) {
data.postValue(mapper.mapAccountList(response))
}
}
} catch (e: Exception) {
Log.d("Проверка", e.message)
}
}
Однако это не сработало, и, наконец, мое приложение упало.
ОБНОВЛЕНИЕ
Я пытался использовать CoroutineExceptionHandler, но это не помогло
fun getAccounts() {
val myJob = GlobalScope.launch(handler) {
val response = interactor.getAccounts()
launch(Dispatchers.Default) {
loadingStatus.progress.set(false)
data.postValue(mapper.mapAccountList(response))
}
}
}
private val handler = CoroutineExceptionHandler { _, exception ->
error.postValue(Any())
loadingStatus.progress.set(false)
when (exception) {
is BusinessDataException -> {
Log.d("Check", exception.message)
}
else -> {
loadingStatus.hasError.set(true)
loadingStatus.textError.set(exception.message)
}
}
}
ОБНОВЛЕНИЕ 2
Это сообщение об исключении в logcat
06-03 17: 18: 01.012 23796-24010 / ru.mtsbank.dbosme E / AndroidRuntime: FATAL EXCEPTION: OkHttp Процесс диспетчера: ru.mtsbank.dbosme, PID:23796 java.lang.Error: ru.mtsbank.dbosme.exceptions.BusinessDataException: Нарушен контракт взаимодействия и дальнейшее описание, что не так ... в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1119) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:588) в java.lang.Thread.run (Thread.java:818) Причина: ru.mtsbank.dbosme.exceptions.BusinessDataException:Нарушен контракт взаимодействия, и далее описание, что не так ... на ru.mtsbank.dbosme.data.web.interceptors.ProxyErrorInterceptor.intercept (ProxyErrorInterceptor.kt: 27) на okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorCha).Java: 147) в okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:121) в ru.mtsbank.dbosme.data.web.interceptors.MainInterceptor.intercept (MainInterceptor.kt: 18) в ohttpin..RealInterceptorChain.proceed (RealInterceptorChain.java:147) в okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:121) в okhttp3.logging.RealInterceptorChain.proceed (RealInterceptorChain.java:147) на okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:121) на okhttp3.RealCall.getResponseWithInterceptorCalAsyncCall.execute (RealCall.java:147) в okhttp3.internal.NamedRunnable.run (NamedRunnable.java:32) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1113Thread.jol).$ Worker.run (ThreadPoolExecutor.java:588) на java.lang.Thread.run (Thread.java:818)