Есть ли способ заставить модификацию игнорировать исключения EOFException и продолжать анализ? - PullRequest
0 голосов
/ 08 октября 2019

Я изменяю способ, которым наше приложение работает, чтобы использовать модификацию вместо просто OkHTTP

Способ, которым он работал, мы отправляли запрос, извлекали тело как входной поток и считывали все байты вstring.

После этого мы будем анализировать тело с помощью gson.

Проблема заключается в том, что у сервера, похоже, есть проблема с конфигурацией (о чем мне говорят, что это в списке вещей дляисправить, но это займет много времени) поэтому, например, он может вернуть 400 байт данных, но отправит сообщение, что байты на самом деле 402.

То, как мы в настоящее время обрабатываем это, - перехват исключения EOF иигнорируя его, а затем анализируя возвращенную строку, как обычно.

прямо сейчас я использую следующий запрос для получения нужных мне сущностей

@GET("/services/v1/entities")
suspend fun getEntities() : List<ServerEntity>

, которые при отсутствии ошибок работают правильно

решения, которые я нашел до сих пор:

a) используют следующий код для повторения всех запросов, пока я не получу исключение EOF:

internal suspend fun <T> tryTimes(times: Int = 3, func: suspend () -> T): T {
    var tries = times.coerceAtLeast(2)
    try {
        var lastException: EOFException? = null
        while (tries > 0) {
            try {
                return func.invoke()
            } catch (eof: EOFException) {
                lastException = eof
                tries--
            }
        }
        throw lastException!!
    } finally {
        log.d("DM", "tried request ${times.coerceAtLeast(2) - tries} times")
    }
}

, который в большинстве случаев регистрирует 0 или 1, пытается

или изменяет все мои запросы на

@GET("/services/v1/entities")
suspend fun getEntities() : ResponseBody 

и анализирует поток вручную (ResponseBody может быть невернымно вы можете понять, что я имею в виду)

есть ли способ использовать мою исходную функцию и дать понять, что в случае исключения EOF оно должно возобновиться вместо остановки?

...