Open
Description
Can be reproduced by simple test:
@Test fun await404() {
val retrofit = Retrofit.Builder()
.baseUrl(server.url("/"))
.addConverterFactory(ToStringConverterFactory())
.build()
val example = retrofit.create(Service::class.java)
server.enqueue(MockResponse().setResponseCode(404))
try {
runBlocking {
val deferred = async { example.body() }
deferred.await()
}
fail()
} catch (e: HttpException) {
val writer = StringWriter()
e.printStackTrace(PrintWriter(writer))
val trace = writer.toString()
assertThat("KotlinSuspendTest" in trace).isTrue()
assertThat("await404" in trace).isTrue()
}
}
By default the stacktrace will look like:
retrofit2.HttpException: HTTP 404 Client Error
at retrofit2.KotlinExtensions$await$2$2.onResponse(KotlinExtensions.kt:53)
at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:161)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:174)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
This is not very helpful, as we don't know which call caused the exception.
Attempt at fixing can be found in #3475, comments appreciated. That would lead to following trace:
retrofit2.HttpException: HTTP 404 Client Error
(Coroutine boundary)
at retrofit2.KotlinSuspendTest$await404$1$deferred$1.invokeSuspend(KotlinSuspendTest.kt:190)
Caused by: retrofit2.HttpException: HTTP 404 Client Error
at retrofit2.KotlinExtensions$await$2$2.onResponse(KotlinExtensions.kt:53)
at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:161)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:174)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)