Возврат объекта из исключения функции приостановки - PullRequest
0 голосов
/ 13 июня 2019

Android-проект:

фрагмент:

import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import okhttp3.MediaType
import okhttp3.ResponseBody
import retrofit2.Response
class DefaultTransportService {
    companion object {
        private val SERVICE_UNAVAILABLE = "{\n" +
                "  \"code\": -1,\n" + // 503
                "  \"message\": \"Service unavailable\"\n" +
                "}"
        private val TAG = DefaultTransportService::class.java.name

        suspend fun executeOperation(operation: Deferred<Response<*>>): Any = withContext(Dispatchers.IO) {
            try {
                operation.await()
            } catch (e: Throwable) {
                val resultResponse = Response.error<Any>(-1, ResponseBody.create(
                        MediaType.parse("application/json"),
                        SERVICE_UNAVAILABLE
                ))
                return resultResponse
            }
        }
    }
}

В строке

return resultResponse

Я получаю ошибку компиляции:

'return' is not allowed here

Но янеобходимо изменить ответ, когда operation.await() выдает любое исключение.

1 Ответ

0 голосов
/ 13 июня 2019

IMHO В вашем случае я бы сделал так, чтобы ваша функция приостановки возвращала sealed class, что-то вроде:

suspend fun doSomething(): Response =
        suspendCancellableCoroutine { cont ->
            try {
                // make some work here
                cont.resume(Response.Success())
            } catch (e: Exception) {
                val error = "Service unavailable"
                cont.resume(Response.Error(error))
                Log.e(TAG, e.message)
            }
        }

sealed class Response {
    class Success : Response()
    class Error(val message: String?) : Response()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...