为什么这个协程会在 运行 时间崩溃?
Why does this coroutine crash at run time?
我试图确保我的应用程序在后端出现故障时做出适当的响应,我正在使用 realm/mongo 创建一个获取用户的异步任务。
我有这两个块:
override suspend fun logIn(accessToken: String) {
val user = logInInternal(accessToken)
realmAsyncOpen(user)
}
和
private suspend fun logInInternal(accessToken: String) = suspendCancellableCoroutine<User> { continuation ->
val customJWTCredentials: Credentials = Credentials.jwt(accessToken)
app.loginAsync(customJWTCredentials) {
if (it.isSuccess) {
continuation.resumeWith(Result.success(app.currentUser()!!))
} else {
continuation.resumeWithException(RealmLoginException().initCause(it.error))
}
}
}
logInInternal
当我点击 resumeWithException
部分时崩溃。我也尝试过使用 app.login(credentials),因为该方法正在暂停,但运气不佳。为什么我的应用程序在我异常恢复时崩溃?
我在命中时导致调用 502。
resumeWithException
的文档说:
Resumes the execution of the corresponding coroutine so that the exception is re-thrown right after the last suspension point.
这意味着您需要捕获该异常:
override suspend fun logIn(accessToken: String) {
try {
val user = logInInternal(accessToken)
realmAsyncOpen(user)
} catch(e: RealmLoginException /*or e: Exception - to catch all exceptions*/) {
// handle exception
}
}
我试图确保我的应用程序在后端出现故障时做出适当的响应,我正在使用 realm/mongo 创建一个获取用户的异步任务。
我有这两个块:
override suspend fun logIn(accessToken: String) {
val user = logInInternal(accessToken)
realmAsyncOpen(user)
}
和
private suspend fun logInInternal(accessToken: String) = suspendCancellableCoroutine<User> { continuation ->
val customJWTCredentials: Credentials = Credentials.jwt(accessToken)
app.loginAsync(customJWTCredentials) {
if (it.isSuccess) {
continuation.resumeWith(Result.success(app.currentUser()!!))
} else {
continuation.resumeWithException(RealmLoginException().initCause(it.error))
}
}
}
logInInternal
当我点击 resumeWithException
部分时崩溃。我也尝试过使用 app.login(credentials),因为该方法正在暂停,但运气不佳。为什么我的应用程序在我异常恢复时崩溃?
我在命中时导致调用 502。
resumeWithException
的文档说:
Resumes the execution of the corresponding coroutine so that the exception is re-thrown right after the last suspension point.
这意味着您需要捕获该异常:
override suspend fun logIn(accessToken: String) {
try {
val user = logInInternal(accessToken)
realmAsyncOpen(user)
} catch(e: RealmLoginException /*or e: Exception - to catch all exceptions*/) {
// handle exception
}
}