【发布时间】:2021-03-13 08:42:55
【问题描述】:
我在 Kotlin 中创建了一个事件系统,可以在其中监听和广播事件,类似于 C# 中事件的工作方式。
要广播事件,我有这行:
playerConnected.broadcast(player)
这里playerConnected 是事件,player 是上下文对象。
在 IntellIJ 中调试时,当“步入”广播函数以查看事件侦听器执行的操作时,它改为步入 broadcast() 函数,这是有道理的,它看起来像这样:
fun broadcast(args: T) {
for (listener in listeners) {
try {
listener.accept(args)
} catch (e: Exception) {
e.printStackTrace()
}
}
}
我有兴趣跳过进入broadcast() 而是直接进入每个accept() 函数,其中listener 是Consumer<T>。
在 C# 中,我可以通过将 DebuggerStepThroughAttribute 添加到 broadcast() 函数来解决此问题。
在 Kotlin 中是否有任何等效属性或在 IntellIJ 中实现相同的其他方式?
【问题讨论】:
-
查看 Kotlin/IntelliJ 文档,它看起来像 you can only direct the debugger to ignore Kotlin's runtime library types and not your own(但对于 Java,你可以,很奇怪)。我建议您向 Jetbrains 提交功能请求。
-
您确定要吞下
broadcast中的异常而不是向上传递吗? -
你的目标是 JVM 吗?如果是这样,您可以将 IntelliJ 设置为忽略
broadcast所在的 Kotlin 类的 Java 对应项。 -
@Dai 这个事件系统是为了运行潜在的用户代码(用于模组),如果我没有捕捉到异常,其余的监听器将不会被执行。然而,我将改进我进行日志记录的方式,以便为事件 l 侦听器开发人员提供更多上下文。我相信这类似于 C# 的事件系统的工作方式。
-
@VapidLinus 啊,你正在执行不受信任的代码 - 玩得开心;)
标签: c# kotlin debugging intellij-idea