为什么我的 kotlin 挂起函数不抛出错误?并继续下一行?
Why my kotlin suspend function don't throw error? And continue to nextline?
这是我的 viewModel 中调用该函数的代码。
viewModelScope.launch {
resource.postValue(Resource.loading(true))
try {
localRepository.insertFile(fileEntity)
///This lines throw exeption
messageRepository.sendMessageWithMediaAudio(message, mediaUri, duration)
///But still continue to this line and don't catch the error
resource.postValue(Resource.success(true))
} catch (exception: Exception) {
Timber.e(exception)
resource.postValue(
Resource.error(exception, exception.message!!)
)
}
}
我想捕获错误,但它不会去捕获。
这是暂停功能
suspend fun sendMessageWithMediaAudio(message: Message, uri: Uri, duration: Long) =
withContext(ioDispatcher) {
applicationScope.launch{Body}.join()
}
是因为这一行:
applicationScope.launch {
Body
}
您正在不同协程范围内启动新协程。 sendMessageWithMediaAudio
returns 在 Body
完成之前。如果你想等到 sendMessageWithMediaAudio
完成(这可能是你想要查看对 .join()
的调用),请不要使用 applicationScope
,只需在提供的范围内启动新协程通过 withContext
.
此外,启动一个新协程并立即等待它完成 (.join()
) 没有任何用处。您可以简单地将 Body
直接放在 withContext
.
中
suspend fun sendMessageWithMediaAudio(message: Message, uri: Uri, duration: Long) {
withContext(ioDispatcher) {
Body
}
}
这是我的 viewModel 中调用该函数的代码。
viewModelScope.launch {
resource.postValue(Resource.loading(true))
try {
localRepository.insertFile(fileEntity)
///This lines throw exeption
messageRepository.sendMessageWithMediaAudio(message, mediaUri, duration)
///But still continue to this line and don't catch the error
resource.postValue(Resource.success(true))
} catch (exception: Exception) {
Timber.e(exception)
resource.postValue(
Resource.error(exception, exception.message!!)
)
}
}
我想捕获错误,但它不会去捕获。
这是暂停功能
suspend fun sendMessageWithMediaAudio(message: Message, uri: Uri, duration: Long) =
withContext(ioDispatcher) {
applicationScope.launch{Body}.join()
}
是因为这一行:
applicationScope.launch {
Body
}
您正在不同协程范围内启动新协程。 sendMessageWithMediaAudio
returns 在 Body
完成之前。如果你想等到 sendMessageWithMediaAudio
完成(这可能是你想要查看对 .join()
的调用),请不要使用 applicationScope
,只需在提供的范围内启动新协程通过 withContext
.
此外,启动一个新协程并立即等待它完成 (.join()
) 没有任何用处。您可以简单地将 Body
直接放在 withContext
.
suspend fun sendMessageWithMediaAudio(message: Message, uri: Uri, duration: Long) {
withContext(ioDispatcher) {
Body
}
}