使用pydevd,有没有办法可以打开& off直接从运行时代码(而不是从调试服务器)暂停未捕获的异常代码,类似于添加pydevd.settrace()
作为断点的行为?
基本上,我有一个大型应用程序,它使用生成器和线程来处理和操作大量数据。因此,手动设置断点可能非常麻烦。目前,我将检查堆栈跟踪,检查代码,并尝试构建一个条件pydevd.settrace()
,希望仅在违规方案被触发时触发。这需要一些试验和错误。
我喜欢做的是制作(或使用)上下文管理器并包装违规代码
with pydevd.suspend_on_exception():
... code causing eventual exception ...
我在pydevd代码周围挖了一下,并尝试(没有运气)各种咒语试图模拟我认为远程调试器正在做的事情。我认为以下会让我接近,但没有骰子。
debugger = pydevd.get_global_debugger()
ex = debugger.add_break_on_exception('Exception', True, True, False, True)
debugger.update_after_exceptions_added([ex])
debugger.enable_tracing_in_frames_while_running_if_frame_eval()
我正在使用pydevd连接到PyCharm远程调试服务器,以防这对解决方案产生影响。
答案 0 :(得分:0)
这段代码对我来说似乎是正确的......
即:运行代码:
if __name__ == '__main__':
import pydevd
debugger = pydevd.get_global_debugger()
ex = debugger.add_break_on_exception('Exception', True, True, False, True)
debugger.update_after_exceptions_added([ex])
debugger.enable_tracing_in_frames_while_running_if_frame_eval()
def foo():
raise Exception()
foo()
在这里停止了正确的例外。
注意:这实际上是在最新的PyDev上测试的,而不是在PyCharm上,但行为应该是相同的。