Kotlin标准库有一个整洁的函数require
,类似于运行时assert
:
@kotlin.internal.InlineOnly
public inline fun require(value: Boolean, lazyMessage: () -> Any): Unit {
contract {
returns() implies value
}
if (!value) {
val message = lazyMessage()
throw IllegalArgumentException(message.toString())
}
}
当我调试时,我希望能够在抛出异常之前在此函数中设置断点。像这样,一旦需求被破坏,我将在调试器中看到整个堆栈跟踪和局部变量。但是,这似乎不起作用:
起初我认为这是因为require
是一个inline
函数。我使用我的inline
函数之一进行了实验,调试器按预期停止。
作为一种解决方法,我尝试将调试器设置为中断异常,但我正在使用的框架(Spring)会在每个应用程序启动时抛出大量异常,这使得忽略不相关的异常变得非常繁琐。
我想知道如何让它发挥作用,但我也对为什么"它没有工作&#34感兴趣;
答案 0 :(得分:2)
目前无法在Kotlin中为标有 InlineOnly 注释的函数设置断点,require
是此类函数之一。标有此注释的内联函数不提供额外的调试信息,以便在堆栈跟踪中保持来自调用站点的线不受影响,但它也会破坏在(https://youtrack.jetbrains.com/issue/KT-24306)内设置断点。
您发现了一种解决方法 - 使用异常断点(https://www.jetbrains.com/help/idea/creating-exception-breakpoints.html)。在这种情况下,IllegalArgumentException
将是最好的类。
如果您的代码中的某些电话无法正常工作,则可能会将其替换为自定义功能,作为另一种解决方法。
(答案已更新。之前的版本错误地声称require
中的断点可能适用于某些来电。)