Обработка исключений, генерируемых пользовательским перехватчиком ohttp в Kotlin Coroutines - PullRequest
0 голосов
/ 04 ноября 2019

Я использую пользовательский Interceptor вместе с клиентом Retrofit в своем приложении для Android, которое выдает исключение при определенных обстоятельствах. Я пытаюсь заставить его работать, используя сопрограммы Kotlin.

Проблема в том, что я не могу обработать вышеупомянутую ошибку, так как в момент, когда исключение выдается из экземпляра Interceptor, происходит сбойцелое приложение вместо того, чтобы быть пойманным в операторе try/catch сопрограммы. Пока я использовал реализацию Rx, исключение было безупречно передано в обратный вызов onError, где я смог обработать его так, как мне было нужно.

Я полагаю, это как-то связано с базовыми потоками, которые используются для сетевого вызова, см. Журналы ниже от места, где выполняется вызов, от перехватчика непосредственно перед выдачей исключения, иstacktrace:

2019-11-04 17:17:34.515 29549-29729/com.app W/TAG: Running thread: DefaultDispatcher-worker-1
2019-11-04 17:17:45.911 29549-29834/com.app W/TAG: Interceptor thread: OkHttp https://some.endpoint.com/...

2019-11-04 17:17:45.917 29549-29834/com.app E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
    Process: com.app, PID: 29549
    com.app.IllegalStateException: Passed refresh token can\'t be used for refreshing the token.
        at com.app.net.AuthInterceptor.intercept(AuthInterceptor.kt:33)

Что я должен сделать, чтобы иметь возможность правильно перехватить и обработать это исключение от Перехватчика? Я что-то упустил?

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Вы должны создать подкласс IOException и использовать его для отправки информации от ваших перехватчиков на ваш вызывающий код.

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

0 голосов
/ 05 ноября 2019

Я не знаю, что именно вам нужно, но понял так:

    OkHttpClient okHttpClient = new OkHttpClient.Builder()  
        .addInterceptor(new Interceptor() {
            @Override
            public okhttp3.Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
                okhttp3.Response response = chain.proceed(request);

                // todo deal with the issues the way you need to
                if (response.code() == SomeCode) {
                   //do something
                    return response;
                }

                return response;
            }
        })
        .build();

Retrofit.Builder builder = new Retrofit.Builder()  
        .baseUrl(url)
        .client(okHttpClient)
        .addConverterFactory(GsonConverterFactory.create());

Retrofit retrofit = builder.build();  
...