在 kotlinjs 中使用协程时,异常处理的最佳模式是什么?

问题描述

我有一个 kotlinjs 应用程序。我像这样处理一个特定的事件(将数据放到组件上):

        onEvent {
            drop = { event ->
                GlobalScope.async {
                    //...
                    dropTask(y,data)
                }
            }
        }

// ...

    // this function has to be a suspend function because model's is
    private suspend fun dropTask(y: Int,taskId: TaskId) {
        // ... prepare data
        model.insertBefore(taskId!!,insertBefore?.id)
    }

// ... Model's function is defined like this:

    suspend fun insertBefore(taskToInsert: TaskId,taskBefore: TaskId?) {
        val (src,_) = memory.find(taskToInsert)

// ... and finally,the find function is:

    fun find(taskId: TaskId): Pair<Task?,Int> {
        // ... 
        return if (task != null) {
            // ...
        } else {          
            throw Exception("Couldn't find task with id $taskId!!")
        }
    }

问题是抛出异常,但没有在任何地方报告。

我试过了:

a) 将 CoroutineExceptionHandler 安装到 GlobalScope.async 中(即:

                val handler = CoroutineExceptionHandler { _,e ->
                    console.log("Caught exception: $e")
                }
                GlobalScope.async(handler) {

...但这永远不会被调用。如果我可以让它工作,这将是相对干净的。如果这是 kotlinjs认行为会更好,这样就不会意外地未报告异常。

b) 调用等待:

           drop = { event ->
                GlobalScope.launch {
                    GlobalScope.async() {
                        // ...
                        dropTask(y,data)
                    }.await()
                }
            }

确实导致异常被记录到控制台,但它太难看了。不可能在挂起函数或协程之外调用 .await(),因此对于这个特定的事件处理程序,我必须在启动中包装异步调用。我一定做错了什么。有人有我应该使用的更好的模式吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...