当前位置: 首页 > 知识库问答 >
问题:

无法捕获suspendCoroutine的异常

朱锐
2023-03-14

所以

我有一个函数,有一个回调,所以我把它包装在一个挂起函数使用SusendCoroutine,但当它错误了,它是崩溃整个应用程序

这里有一个概念是正在发生的事情。

val scope = CoroutineScope(Dispatchers.IO)

scope.launch {
    try {
        test()
    } catch (e: Exception) {
         logE { e.asLog() }
    }
}

suspend fun test() = suspendCoroutine<Unit> { cont ->
     cont.resumeWithException(IllegalStateException("Umm")) // The andoird app is crashing 
}

2022-03-04 16:09:45.410 19289-19438/in.app.androidE/AndreidRuntime: FATAL EXCEPTION: DefaultDispatcher-Worers-3进程:in.app.android,PID:19289java.lang.可抛出:Umm在in.app.android.MainActivity.test(MainActivity.kt:187)在in.app.android.Main活动$on创建$5.invoke暂停(MainActivity.kt:177)在kotlin.coroutines.jvm.internal.BaseContinuationImpl.resume(继续mpl.kt:33)在kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)在kotlinx.coroutines.scheduling.CoroutineScheduler.run安全(CoroutineScheduler.kt:571)在kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.execute任务(CoroutineSchedler. kt: 750)在kotlinx. coroutins.调度。CoroutineScheduler$Worker. runWorker(CoroutineScheduler. kt: 678)在kotlinx. coroutines.调度。CoroutineScheduler$Worker. run(CoroutineScheduler. kt: 665)

suspendCoroutine子句中得到抛出时,如何捕获任何异常?

编辑

所以,问题是我抛出了一个一次性的,但捕捉到了一个异常。

共有2个答案

姬心思
2023-03-14

你试过SuspendCancelableCoroutine吗?您可以在回调结束时调用回调,如下所示:

cont.invokeOnCancellation {
            callback = null
        }

为了实现,将回调的局部变量设置为active,并检查cancelablecontinuation,如下所示

 fun onFail(e: Exception) {
     if (cont.isActive) {
        cont.resumeWithException(e)
     }
 }
杨海
2023-03-14

正如broot提到的,您的日志显示您的someService正在抛出一个可丢弃的,而不是异常。如果你像这样修改代码,你会没事的

try {
     test()
} catch (e: Throwable) {
      
}
 类似资料:
  • 我通过激发Baeldung在Spring Security页面上的防止暴力身份验证尝试,为我的登录服务实现了暴力阻止机制,如下所示: 当用户未经验证时,LoginService抛出InvalidCredentialException(),然后我试图在AuthenticationFailureListener类中捕获此异常: 当出现错误时,则登录测试服务。将调用loginFailed()方法。然而,

  • 我正在尝试使用以下代码使用流 API 获取 S3 对象的文件大小: 如果该项不存在,我会得到以下错误: [2015年10月13日星期二23:03:32][错误][客户端54.225.205.152]PHP警告:找不到文件或目录:s3://mybucket/myfile.jpg在/var/www/vendor/Aws/Aws-SDK-PHP/src/Aws/S3/stream wrapper . P

  • 我无法在Spring中捕获异步方法抛出的异常。我已经编写了一个未捕获的异常处理程序来捕获,但没有成功。该应用程序将启用启动任意数量的永远运行的异步作业。我认为我的异步方法需要返回Future,以便我可以将其存储在hashmap中并检查其状态或停止作业。我也可以通过存储它来获取所有正在运行的作业。我认为我不能使用get method of Future,因为如果输入正确,它会阻塞,我的作业将永远运行

  • 对于我的RESTAPI,我使用jersey和ExceptionMapper来捕获全局异常。我的应用程序抛出的所有异常都运行良好,但我无法捕获jackson抛出的异常。 例如,我的一个endpoint接受包含枚举的对象。如果请求中的Json有一个不在枚举jersey中的值,则抛出此异常 尽管我创造了这个映射器 代码永远不会到达这个映射器。 为了捕捉这些异常,我们需要做些什么吗? 编辑说明:我尝试过让

  • 是否有可能在Delphi中构建一个代码片段,使假设的EChuckNorrisException无法捕获? 对于Java编程语言,我刚刚发现在Uncatchable ChuckNorriseException中,答案是肯定的

  • 问题内容: 是否可以在Java中构建一小段代码,以使假设的代码无法捕获? 想到的想法正在使用例如拦截器或面向方面的编程。 问题答案: 我没有试过,所以我不知道,如果JVM将限制这样的事情,但也许你可以编译代码抛出,但在运行时提供了一个类定义的其 未延伸的Throwable 。 更新: 没用 它生成一个验证错误: 更新2: 实际上,如果禁用字节码验证程序,则可以使它正常工作!() 更新3: 对于那些