当我在拦截器中抛出异常时改造崩溃
Retrofit crashes when I throw an exception in an interceptor
我有一个拦截器可以处理一些身份验证的事情。如果身份验证失败,它会抛出异常。据我所知,抛出异常应该会导致在我处理异常的地方调用 onFailure。不幸的是,这并没有发生,应用程序完全崩溃了。我确定我一定遗漏了一些东西,但我似乎无法弄清楚。希望这里有人可以提供帮助:)
下面的代码和堆栈跟踪:
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
}
})
堆栈跟踪:
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.intercept(RetrofitWebApi.kt:90)
at com.testapp.test.data.networking.RetrofitWebApi$client.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 只会捕获 Interceptor
中发生的异常,如果它是 IOException
。你可以看到执行此操作的代码here,相关部分(简化)如下:
try {
Response response = getResponseWithInterceptorChain();
} catch (IOException e) {
responseCallback.onFailure(RealCall.this, e);
}
因此,如果您将代码更改为以下内容,您将在 onFailure
方法中按预期获得回调:
val client = OkHttpClient.Builder()
// Add interceptor that throws
.addInterceptor { chain ->
throw IOException("test")
}
.build()
我有一个拦截器可以处理一些身份验证的事情。如果身份验证失败,它会抛出异常。据我所知,抛出异常应该会导致在我处理异常的地方调用 onFailure。不幸的是,这并没有发生,应用程序完全崩溃了。我确定我一定遗漏了一些东西,但我似乎无法弄清楚。希望这里有人可以提供帮助:)
下面的代码和堆栈跟踪:
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
}
})
堆栈跟踪:
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.intercept(RetrofitWebApi.kt:90)
at com.testapp.test.data.networking.RetrofitWebApi$client.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 只会捕获 Interceptor
中发生的异常,如果它是 IOException
。你可以看到执行此操作的代码here,相关部分(简化)如下:
try {
Response response = getResponseWithInterceptorChain();
} catch (IOException e) {
responseCallback.onFailure(RealCall.this, e);
}
因此,如果您将代码更改为以下内容,您将在 onFailure
方法中按预期获得回调:
val client = OkHttpClient.Builder()
// Add interceptor that throws
.addInterceptor { chain ->
throw IOException("test")
}
.build()