Обработка исключения внутри компонента Koin

У меня есть вопрос относительно исключения обработки монет.

В модуле, где я определил EncryptedSharedPreferences.create(), иногда возникает исключение, которое приводит к сбою в устройстве пользователя. Я вижу в отчете о сбоях, что сбой происходит уже более 200 раз. Ниже приведено более конкретное исключение.

Caused by java.security.UnrecoverableKeyException: Failed to obtain information about key

...

Caused by android.security.KeyStoreException: -49

По-видимому, об этой проблеме уже сообщалось, но нет действительного ответа на ее решение. Поскольку я использую Koin для определения EncryptedSharedPreferences, я подумал, что лучше обрабатывать его внутри функции single{}. Поместите try catch, который поймает исключение. Но когда я пытаюсь бросить Exception внутри попытки, он не поймал исключение, это просто сбой, а не то, что я ожидал. Код выглядит следующим образом

single(named(ENCRYPTED_SHARED_PREF)) {
    val context = androidApplication().applicationContext
    try {
        val masterKey =
            MasterKey.Builder(context, MasterKey.DEFAULT_MASTER_KEY_ALIAS)
                .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
                .build()

        EncryptedSharedPreferences.create(
            context,
            SP_ENCRYPTED_KEY,
            masterKey,
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
     )

        throwError()
     } catch (e: Exception) {
        Timber.d("[SHARED PREF] Terjadi exception")
        when (e) {
            is KeyStoreException -> {
               Toast.makeText(context, "Terjadi exception", Toast.LENGTH_SHORT).show()
            }
        }
        //Update missing link below
        androidApplication().getSharedPreferences(SP_KEY, Context.MODE_PRIVATE)
     }
}

...

@Throws(KeyStoreException::class)
fun throwError(): Nothing {
    throw KeyStoreException("Terjadi exception")
}

Теперь вопрос, есть ли способ обработки такого рода исключений внутри Koin single или нет? Я пытался найти документацию и погуглить ее, мне кажется, это тупик.

Другая полезная информация:

  • EncryptedSharedPreferences версия : androidx.security:security-crypto:1.1.0-alpha03
  • Система отслеживания ошибок для EncryptedSharedPreferences, с которой я столкнулся: https://issuetracker.google.com/u/1/issues/167977579
  • Сбой или исключение не связано с проблемой Koin, а связано с EncryptedSharedPreferences
  • Версия монеты: org.koin:koin-android-viewmodel:2.1.6

ОБНОВИТЬ РЕШИТЬ

Мне потребовалось некоторое время, чтобы понять, что блок catch должен возвращать что-то вроде значения или другого объекта, скажем, обычно разделяемого предпочтения. В коде нет ничего плохого после тщательного исследования. Спасибо всем, я также обновляю код в своем объяснении выше.


person bobby I.    schedule 28.12.2020    source источник
comment
Я не думаю, что это имеет какое-либо отношение к коину. И вы не должны обрабатывать это в декларации зависимости koins single {}. Этому исключению есть причина. Возможно, это поможет вам: stackoverflow.com/questions/36652675/   -  person ChristianB    schedule 28.12.2020
comment
single должен возвращать значение (или бросать), поэтому убедитесь, что ваш код восстановления работает таким же образом.   -  person laalto    schedule 28.12.2020
comment
Я видел ссылку, которую вы дали. И это отличается от моей проблемы. Моя проблема связана с самой библиотекой, поэтому я ничего не могу сделать. @КристианБ   -  person bobby I.    schedule 30.12.2020
comment
Yaps, это правда, я думаю, это то, чего мне не хватает, когда я возвращаю объект, скажем, SharedPreference, он работает нормально, спасибо @laalto   -  person bobby I.    schedule 30.12.2020


Ответы (1)


если ваш try-catch не работает и ваше приложение аварийно завершает работу, это означает, что вещи внутри блока try находятся в другом потоке. проверьте это у меня была такая же проблема, но не внутри коина в этом . я исправил с помощью сопрограммы Android -> теперь я могу поймать исключение

вы также можете проверить асинхронные переменные внутри koin здесь

person Arvin Rezaei    schedule 28.12.2020
comment
Я думаю, что проблема не в том, что это в другом потоке, а в том, что я не возвращаю значение в блоке catch, изо всех сил пытаясь это понять. очень ценю ваш ответ, спасибо - person bobby I.; 30.12.2020