Android Kotlin“ withTimeout”协程如何处理异常

时间:2020-04-26 15:16:04

标签: android kotlin kotlin-coroutines

我正在使用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)

1 个答案:

答案 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)
 }
}