Попробуйте исключение исключения блока, но блок захвата не ловит это - PullRequest
1 голос
/ 26 января 2020

Я использую логин Google и получаю исключение. Однако, похоже, что я не могу его поймать.

У меня есть следующий код:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {
            RC_SIGN_IN -> {
                val task = try{
                    GoogleSignIn.getSignedInAccountFromIntent(data)
                } catch (e: ApiException) {
                    Log.d("EXCEPTION", e.message)
                    when(e.statusCode) {
                        12501 -> return
                        else -> {
                            e.printStackTrace()
                            return
                        }
                    }
                }
...

Из Logcat я вижу, что ApiException - правильное исключение для ловли :

enter image description here

И это определенно тот, кого я ловлю:

enter image description here

Сначала я подумал, что по какой-то причине за это может отвечать прямое назначение с val task = try..., поэтому я изменил свой код соответствующим образом и попробовал это:

var task: Task<GoogleSignInAccount>?
try{
    task = GoogleSignIn.getSignedInAccountFromIntent(data)
} catch (e: ApiException) {
    Log.d("EXCEPTION", e.message)
    when(e.statusCode) {
       12501 -> task = null
       else -> {
           e.printStackTrace()
           task = null
       }
    }
}

Тем не менее такое же поведение. Поэтому я подумал, что, может быть, - это другое выбрасываемое исключение, поэтому я добавил еще один блок catch:

var task: Task<GoogleSignInAccount>?
try{
    task = GoogleSignIn.getSignedInAccountFromIntent(data)
} catch (e: ApiException) {
    Log.d("EXCEPTION", e.message)
    when(e.statusCode) {
       12501 -> task = null
       else -> {
           e.printStackTrace()
           task = null
       }
    }
} catch (e: Exception) {
    Log.d("EXCEPTION", e.message)
    task = null
}

Все то же поведение. Я обнаружил этот код с точками останова на каждом шаге, но он просто полностью игнорирует блок catch. Я останавливаюсь в блоке try:

enter image description here

Но если я возобновлю, следующий шаг будет за пределами моего блока try-catch.

enter image description here

Может кто-нибудь объяснить такое поведение?

1 Ответ

0 голосов
/ 26 января 2020

Так же, как я задал этот вопрос, я кое-что понял:

Блок catch игнорируется, потому что блок try на самом деле не выдает исключение.

Объект task установлен и это тот, который содержит исключение. Когда объект task используется позже, например так: val account = task.getResult(ApiException::class.java), тогда именно здесь и создается исключение. По крайней мере, это то, что я ожидаю здесь. Само исключение в основном перехватывается, сохраняется и генерируется в более поздний момент времени, но со старой трассировкой стека ...

Не уверен на 100% о внутренней работе этого, но это то, что я могу сказать из logcat и мой код.

Итак, вместо попытки перехвата, я просто пошел и обработал исключение вручную:

val task = GoogleSignIn.getSignedInAccountFromIntent(data)
if(task.exception != null) {
    val e = task.exception as? ApiException
    if(e != null) {
        when(e.statusCode) {
            12501 -> return
            else -> {
                e.printStackTrace()
                return
            }
        }
    } else {
        task.exception?.printStackTrace()
    }
    return
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...