Google Places API: исключение времени выполнения не обнаружено

У меня проблемы, похожие на ту, что на этот вопрос. Однако, в отличие от этого вопроса, у меня есть правильная настройка (ключи API указаны в манифесте, API карт и мест включены в консоли Google), потому что код работает наиболее времени:

private fun performPlaceDetection() {
        // use the Places API.
        try {
            val placeResult = placeDetectionClient.getCurrentPlace(null)
            placeResult.addOnCompleteListener({ task ->
                val likelyPlaces = task.result
                for (placeLikelihood in likelyPlaces) {
                    Timber.d( String.format("Place '%s' has likelihood: %g",
                            placeLikelihood.place.name,
                            placeLikelihood.likelihood))
                }
                likelyPlaces.release()
            })
        } catch (e: SecurityException) {
            Timber.d("error fetching current place. permissions?: " + e.message)
            e.printStackTrace()
        } catch (e: RuntimeExecutionException) {
            Timber.d("error fetching current place: " + e.message)
            e.printStackTrace()
        }
    }

Код иногда дает сбой:

com.google.android.gms.tasks.RuntimeExecutionException: com.google.android.gms.common.api.ApiException: 13: ERROR

или когда я отключаю сетевое подключение, я получаю эту ошибку:

com.google.android.gms.tasks.RuntimeExecutionException: com.google.android.gms.common.api.ApiException: 7: NETWORK_ERROR

Что меня озадачивает, так это то, что в любом случае исключение (RunTimeExecutionException) не обнаруживается. Я понимаю, что в Котлине все исключения не отмечены, но я предполагаю, что они будут пойманы, если возникнет ошибка. Какие-нибудь подсказки?

Обновлено: Похоже, при отлове исключения внутриOnCompleteListener работает, а внешнее не отлавливается:

try {
            val placeResult = placeDetectionClient.getCurrentPlace(null)
            placeResult.addOnCompleteListener({ task ->
                try {
                    val likelyPlaces = task.result
                    for (placeLikelihood in likelyPlaces) {
                        Timber.d( String.format("Place '%s' has likelihood: %g",
                                placeLikelihood.place.name,
                                placeLikelihood.likelihood))
                    }
                    likelyPlaces.release()
                } catch (e: Exception) {
                    Timber.d("inner exception: $e")
                }
            })
        } catch(e: Exception) {
            Timber.d("outer exception: " + e::class.qualifiedName)
        } 

Я не уверен, почему обнаружено внутреннее исключение. Я предполагаю, что это потому, что placeDetectionClient.getCurrentPlace() работает асинхронно (и что ошибки генерируются API Places из отдельного потока), но я не уверен (performPlaceDetection() вызывается из MainActivity приложения Android). Был бы признателен за некоторый вклад в это.

Ваше обновление помогло мне ... пожалуйста, сделайте это как ответ. Благодарю.

Rathiga Jesika 09.05.2018 07:04
4
1
391
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Убедитесь, что RunTimeExecutionException импортирован с com.google.android.gms.tasks.RuntimeExecutionException. Возможно, вы импортировали его из другого пакета, а это значит, что это другое исключение.

Я считаю, что у меня правильный импорт: import com.google.android.gms.tasks.RuntimeExecutionException

kip2 02.05.2018 14:13

Я думаю, что фактическое выброшенное исключение может быть ApiException, которое не перехвачено, а исключение RuntimeExecutionException выбрасывается позже, потому что ApiException не обрабатывается. Я думаю, это потому, что он вложен в сообщение об исключении RuntimeExecutionException. Вы можете это проверить? Я обновлю свой ответ, если это так.

J. Leander 02.05.2018 15:57

Сначала я пытался поймать ApiException, но у меня была та же проблема, и тогда я переключился на попытку поймать RuntimeExecutionException.

kip2 02.05.2018 16:25

Вы получаете ту же ошибку при перехвате исключения ApiException?

J. Leander 02.05.2018 16:49

не могли бы вы добавить этот оператор catch? catch(e: Exception) { println(e::class.qualifiedName) }

J. Leander 02.05.2018 16:59

Я отключил подключение (чтобы заставить RuntimeExecutionException, связанный с сетью) и попытался поймать общий Exception, и, как и раньше, он не улавливается, и я просто получаю обычную ошибку: com.google.android.gms.tasks.RuntimeExecutionException: com.google.android.gms.common.api.ApiException: 7: NETWORK_ERROR at com.google.android.gms.tasks.zzu.getResult(Unknown Source:17) at com.example.app.MyActivity$performPlaceDetection$1.onComplet‌​e(MyActivity.kt:197)

kip2 03.05.2018 11:20
Ответ принят как подходящий

Похоже, что перехват исключения внутри OnCompleteListener работает, а внешний не отлавливается:

try {
        val placeResult = placeDetectionClient.getCurrentPlace(null)
        placeResult.addOnCompleteListener({ task ->
            try {
                val likelyPlaces = task.result
                for (placeLikelihood in likelyPlaces) {
                     Timber.d( String.format("Place '%s' has likelihood: %g",
                           placeLikelihood.place.name,
                           placeLikelihood.likelihood))
                }
                likelyPlaces.release()
            } catch (e: Exception) {
                Timber.d("inner exception: $e")
            }
        })
    } catch(e: Exception) {
            Timber.d("outer exception: " + e::class.qualifiedName)
} 

Я не уверен, почему обнаружено внутреннее исключение. Я предполагаю, что это потому, что placeDetectionClient.getCurrentPlace () работает асинхронно (и что ошибки генерируются API Places из отдельного потока), но я не уверен (performPlaceDetection () вызывается из MainActivity приложения Android)

Не обращайте внимания на ответы, в которых говорится, что вам следует использовать try-catch с Task<T> из библиотек Google.

Проблема здесь в том, что люди пытаются получить результат от невыполненной задачи.

Если вы посмотрите на исходный код, вы можете ясно увидеть, что если вы обращаетесь к task.result и task.exception != null, реализация выдаст RuntimeExecutionException.

Вы должны получить такой результат:

FirebaseInstanceId.getInstance().instanceId.addOnCompleteListener {
            if (it.isSuccessful) {
                val token = it.result?.token
                if (!token.isNullOrBlank()) {
                    //do something with the token
                } else {
                    logger.error("Token Is Empty")
                }
            } else {
                val error = it.exception ?: Exception("Empty Exception")
                logger.error("$error")
            }
        }

Другие вопросы по теме