【问题标题】:Handle exception inside Koin component处理 Koin 组件内的异常
【发布时间】:2021-04-05 00:56:30
【问题描述】:

我有一个关于 Koin 处理异常的问题。

在我定义EncryptedSharedPreferences.create() 的模块中,有时会导致异常,从而导致用户设备崩溃。我在 crashlytic 报告中看到崩溃已经发生了 200 多次。更具体的例外情况如下。

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

...

Caused by android.security.KeyStoreException: -49

显然,此问题已报告,但没有有效的答案来处理或解决它。因为我使用 Koin 来定义 EncryptedSharedPreferences,所以我认为最好在 single{} 函数中处理它。放置一个try catch 将捕获异常。但是当我尝试在 try 中抛出 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
  • Koin 版本:org.koin:koin-android-viewmodel:2.1.6

更新解决

我花了一段时间才意识到catch 块需要返回诸如值或另一个对象之类的东西,比如说通常共享的偏好。经过深入研究,代码没有错。谢谢大家,我也更新了上面解释中的代码。

【问题讨论】:

  • 我认为这与 koin 无关。而且你不应该在 koins 依赖声明 single {} 中处理它。这个例外是有原因的。也许这会对你有所帮助:stackoverflow.com/questions/36652675/…
  • A single 需要返回一个值(或抛出),因此请确保您的恢复代码也以这种方式工作。
  • 我看过你给的链接。这与我的问题不同。我的问题与 lib 本身有关,所以我无能为力。 @ChristianB
  • 是的,没错,我想这就是我所缺少的,当我返回一个对象时,比如说 SharedPreference,它工作正常,谢谢@laalto

标签: android exception dependency-injection try-catch koin


【解决方案1】:

如果你的 try-catch 不起作用并且你的应用程序崩溃了,这意味着 try 块中的东西在另一个线程中。 check this 我有同样的问题,但不是在 koin init 里面。我通过使用 android coroutine 修复了 -> 我现在可以捕获异常

您还可以检查 koin here 中的异步变量

【讨论】:

  • 我认为问题不是因为它在另一个线程中,而是我没有在catch 块中返回值,努力实现这一点。非常感谢您的回答,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多