Android Kotlin сопрограмма "withTimeout", как обрабатывать исключения - PullRequest
2 голосов
/ 26 апреля 2020

Я использую retrofit2 для вызова API с сопрограммами kotlin, но API имеет коды состояния 200, 400 и 700. При запросе API и код состояния ответа были 400 или 700, что сопрограмма «withTimeout» может быть исключением CRA sh. Я хочу обработать ответные сообщения с кодами состояния 400 и 700 с сопрограммой «withTimeout» или как настроить «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 голосов
/ 27 апреля 2020

На самом деле, SocketTimeoutException должно быть обработано, но здесь вы можете обработать универсальное c Исключение здесь и позже проверьте, исключение составляет SocketTimeoutException, JsonSyntaxException, UnknownHostException, ConnectException или другие.

Итак, вы можете попробовать это.

suspend fun getLogin() {
 try {
 //Your api call code here.
 }catch (e: Exception) {
    e.printStacktrace();
    //throw ApiError("Unable to login", e)
 }
}
...