web-dev-qa-db-fra.com

Manipuler des exceptions projetées par un intercepteur OKHTTP personnalisé à Kotlin Coroutines

J'utilise une personnalité Interceptor avec le client de modernisation dans mon Android application, qui jette une exception dans des circonstances spécifiques. J'essaie de le faire fonctionner à l'aide de Kotlin Coroutines .

Le problème est que je ne parviens pas à gérer l'erreur précédemment mentionnée, car au moment où l'exception est lancée à partir de l'instance d'intercepteur, elle bloque toute l'application au lieu d'être prise dans la COROUTINE try/catch déclaration. Pendant que j'utilisais la mise en œuvre RX, l'exception était parfaitement propagée au rappel onError où j'ai pu gérer la façon dont j'avais besoin.

Je suppose que cela est en quelque sorte lié aux threads sous-jacents utilisés pour l'appel réseau, veuillez consulter les journaux ci-dessous de l'endroit où l'appel est effectué, de l'intercepteur juste avant de jeter l'exception et de la standingTrace:

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)

Qu'est-ce que je suis censé faire pour pouvoir attraper et gérer cette exception de l'intercepteur correctement? Est-ce que je manque quelque chose?

9
mrpasqal

Je ne sais pas ce que vous avez besoin exactement, mais compris comme ça:

    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();  
0
Matheus Lima