【发布时间】: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