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

5
我使用retrofit2和kotlin协程调用API,但是API返回的状态码有200、400和700。 当请求API并且响应状态码为400或者700时,"withTimeout"协程会抛出异常崩溃。 我希望能够使用"withTimeout"协程处理状态码为400和700的响应消息,或者如何自定义"CoroutineScope"。谢谢。
这是我的代码:
 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个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接