我发现一些文档争论 Kotlin 协程中使用 launch
和 async
进行异常处理的问题。但我找不到处理 withContext
的解决方案。
假设我有一个像这样的协程:
fun bar(path: String) {
viewModelScope.launch {
val foo = withContext(Dispatchers.IO) {
foo(path)
}
}
}
fun foo(path: String) {
// do something...
val media = MediaMetadataRetriever()
media.setDataSource(path) // may throw IllegalArgumentException according to API's doc
return media.frameAtTime
}
viewModelScope
是使用 SupervisorJob
从 lifecycle-viewmodel-ktx
的实现导入的。
我应该在哪里放置一个 try-catch block 来处理这里的 IOException?
最佳答案
Kotlin 协程中的
try-catch 感觉有点笨拙,但我认为部分原因是 Kotlin 的设计者认为你不应该首先使用它。当某些事情是受检查的异常(由程序员控制之外的事情引起)时,他们的建议是包装它或返回 null。例如:
fun foo(path: String): Bitmap? {
// do something...
val media = MediaMetadataRetriever()
try {
media.setDataSource(path)
catch (e: IOException) {
Log.e(TAG, "Failed to set media data source", e)
return null
}
return media.frameAtTime
}
fun bar(path: String) {
viewModelScope.launch {
val foo = withContext(Dispatchers.IO) {
foo(path)
}
if (foo == null) {
// show error to user or something
} else {
// do something with smart-cast non-null foo Bitmap
}
}
}
顺便说一句,对于像 foo
这样永远不会从主线程调用的阻塞函数,我建议将其设为 suspend
函数并移动 withContext(Dispatchers.IO)
到函数中,因此它是独立的,您可以从任何协程中自由调用它。
关于android - 使用 withContext 方法在 kotlin 协程中进行 try-catch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63615738/