Retrofit se bloquea cuando lanzo una exception en un interceptor

Tengo un interceptor que maneja algunas cosas de authentication. Si la authentication falla, lanza y Excepción. De acuerdo con lo que pude encontrar lanzando una exception debería resultar en que se llame aFalto donde manejo la exception. Desafortunadamente, esto no sucede y la aplicación simplemente se cuelga por completo. Estoy seguro de que me estoy perdiendo algo, pero no puedo entenderlo. Espero que alguien aquí pueda ayudar 🙂

Código y seguimiento de la stack a continuación:

val client = OkHttpClient.Builder() // Add interceptor that throws .addInterceptor { chain -> throw Exception("test") } .build() retrofit = Retrofit.Builder() .baseUrl(baseURL) .client(client) .build() api = retrofit.create(ApiInterface::class.java) // Create api call... apicall.enqueue(object : Callback<T> { override fun onResponse(call: Call<T>?, response: retrofit2.Response<T>?) { // .... } override fun onFailure(call: Call<T>?, t: Throwable?) { // Expect to go here to handle the Exception. But the app crashes } }) 

Stack trace:

 E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher Process: com.testapp.test.debug, PID: 28891 java.lang.Error: java.lang.Exception: test at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1168) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at java.lang.Thread.run(Thread.java:764) Caused by: java.lang.Exception: test at com.testapp.test.data.networking.RetrofitWebApi$client$1.intercept(RetrofitWebApi.kt:90) at com.testapp.test.data.networking.RetrofitWebApi$client$1.intercept(RetrofitWebApi.kt:76) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:185) at okhttp3.RealCall$AsyncCall.execute(RealCall.java:135) at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at java.lang.Thread.run(Thread.java:764) 

OkHttp solo detectará la exception que ocurre en el Interceptor si se trata de una IOException . Puede ver el código que hace esto aquí , las partes relevantes (simplificadas) son las siguientes:

 try { Response response = getResponseWithInterceptorChain(); } catch (IOException e) { responseCallback.onFailure(RealCall.this, e); } 

Entonces, si cambia su código a lo siguiente, recibirá una callback en su método onFailure como se esperaba:

 val client = OkHttpClient.Builder() // Add interceptor that throws .addInterceptor { chain -> throw IOException("test") } .build() 
  • Retrofit2 return null Unidad en kotlin para 204 Sin respuesta de contenido
  • Obtención de class no encontrada Excepción al usar KotlinJsonAdapterFactory () en Moshi 1.5 con Kotlin
  • El parámetro no tiene una coincidencia; SimpleXML
  • Problemas al analizar datos con RxJava + Kotlin
  • Retrofit2 y kotlin
  • ¿Cómo usar Kotlin enum con Retrofit?
  • ¿Cómo puedo usar RetroFit2 responseBodyConverter en Kotlin?
  • Readaptación con kotlin, incapaz de crear @Body
  • Retrofit-Vertx con RxJava2 en Kotlin IllegalStateException message == null
  • ¿Cómo correctamente serializar tal JSON por medio de GSON Android?
  • Cómo llenar una vista de list usando Kotlin, retroadaptación y RXjava