有什么办法可以指定断点来停止所有'throw'语句吗? (符号断点)
guard let id = UInt(idString),
let changeset = UInt(changesetString),
let uid = UInt(uidString)
else {
throw OSMVectorMapDescriptionError.ElementAttributeConversionError(element: xmlNode, attributeº: nil)
}
答案 0 :(得分:23)
首先要记住的是,Swift中抛出的错误不是例外,只是错误(NSError
,无论基于ErrorType
,......)。
第二件事是,不要使用try!
,除非你确定它不会崩溃或崩溃是你真正想要的。
不要将symbolic breakpoint与exception breakpoint混在一起。不同的野兽。
回到你的问题......
throw
不是符号,因此符号断点对您不起作用。但是有一种方式......
(lldb)br s -E swift
-E <language> ( --language-exception <language> )
Set the breakpoint on exceptions thrown by the specified language
(without options, on throw but not catch.)
......这有点误导,因为抛出的错误不是例外。记住这一点。当你尝试在Xcode中设置异常断点时,没有Swift。可能主要的原因是抛出的错误不是例外,他们也没有弄清楚把它放在哪里(谁知道)。
手动添加
在代码中的某处设置断点,当执行暂停时,只需在LLDB提示符下键入br s -E swift
,然后继续。
自动添加
以这种方式在代码中的某处设置断点...
...并在您想要停在throw
时切换(开/关)。
符号断点
当您使用已经提及的br s -E swift
时,您将找到throw
的符号。实际上它不是throw
,而是swift_willThrow
。随意以这种方式设置符号断点......
...我现在不推荐这种方式,因为将来可以更改。但如果它现在已经足够了,为什么不呢。
你可以像这样在Xcode项目中分享你的断点......
...辅助点击,将断点移至,用户。断点将在所有Xcode项目中可见。
当你达到断点时,你最终会得到类似的东西......
...你必须选择先前的堆栈帧来查看错误被抛出的位置......
答案 1 :(得分:6)