Мне было интересно, как лучше всего обрабатывать сетевые ошибки в запросах на модификацию при использовании сопрограмм.
Классическим способом является обработка исключений на самом высоком уровне, когда сделан запрос:
try {
// retrofit request
} catch(e: NetworkException) {
// show some error message
}
Я считаю это решение неправильным и оно добавляет много стандартного кода, вместо этого я пошел на созданиеперехватчик, который возвращает ответ об ошибке:
class ErrorResponse : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
return try {
chain.proceed(request)
} catch (e: Exception) {
Snackbar.make(
view,
context.resources.getText(R.string.network_error),
Snackbar.LENGTH_LONG
).show()
Response.Builder()
.request(request)
.protocol(Protocol.HTTP_1_1)
.code(599)
.message(e.message!!)
.body(ResponseBody.create(null, e.message!!))
.build()
}
}
}
Это решение немного лучше, но я думаю, что оно может быть улучшено.
Итак, мой вопрос: как правильнообрабатывать случаи, когда у пользователя нет подключения к Интернету, без большого количества стандартного кода (в идеале с глобальным обработчиком в случае ошибок подключения)?