我正在使用Retrofit2来调用带有Kotlin协程的API,但该API的状态码为200、400和700。 请求时,API和响应状态代码为400或700,其中“ withTimeout”协程可能会导致异常崩溃。 我想使用“ withTimeout”协程或如何自定义“ CoroutineScope”来处理状态码400和700响应消息。
这是我的代码
suspend fun getLogin() {
try {
var result = withTimeout(5_000) { // <----this line can be crashed with http code 700
accountService.getLogin(
LoginRequest() // request data
) // retrofit
}
when (result.state_code) { // api response state code
200 -> {
Timber.i("Create account got data: ${result.source}")
}
400 -> {
//....... handle this status code error
}
700 -> {
//....... handle this status code error
}
}
} catch (e: ApiError) {
throw ApiError("Unable to login", e)
}
}
错误消息
2020-04-26 22:55:10.384 28895-28895/com.mgear.mednetapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.mgear.mednetapp, PID: 28895
retrofit2.HttpException: HTTP 700
at retrofit2.KotlinExtensions$await$2$2.onResponse(KotlinExtensions.kt:53)
at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:150)
at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:504)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
答案 0 :(得分:2)
实际上,应该处理 SocketTimeoutException ,但是您可以在此处处理通用的 Exception ,然后再检查您的异常是 SocketTimeoutException,JsonSyntaxException,UnknownHostException,ConnectException还是其他。
所以,您可以尝试一下。
suspend fun getLogin() {
try {
//Your api call code here.
}catch (e: Exception) {
e.printStacktrace();
//throw ApiError("Unable to login", e)
}
}