我使用的Python标准库和其他库(例如PyQt)有时会对非错误条件使用异常。除函数os.get_exec_path()
外,请查看以下内容。它使用多个try
语句来捕获在尝试查找某些环境数据时抛出的异常。
try:
path_list = env.get('PATH')
except TypeError:
path_list = None
if supports_bytes_environ:
try:
path_listb = env[b'PATH']
except (KeyError, TypeError):
pass
else:
if path_list is not None:
raise ValueError(
"env cannot contain 'PATH' and b'PATH' keys")
path_list = path_listb
if path_list is not None and isinstance(path_list, bytes):
path_list = fsdecode(path_list)
这些异常并不表示错误,而是在正常情况下抛出。对其中一个异常使用异常断点时,调试器也会破坏这些库函数。
在PyCharm或Python中是否有一种方法可以让调试器不会在没有任何代码涉及的情况下抛出并捕获到库中的异常?
答案 0 :(得分:2)
在PyCharm中,转到Run - >查看断点,然后检查" On raise"和"忽略库文件"。
第一个选项使调试器在引发异常时停止,而不是仅在程序终止时停止,第二个选项为PyCharm提供忽略库文件的策略,因此主要在代码中进行搜索。
感谢CrazyCoder link对功能请求的解决方案,该功能已被添加。
答案 1 :(得分:1)
有一段时间我有一个复杂的计划,其中包括以下内容:
try( Closeable ignore = Debugger.newBreakSuppression() )
{
... library call which may throw ...
} <-- exception looks like it is thrown here
这使我永远不会被库调用中抛出和吞没的异常所困扰。如果库调用抛出了一个异常并且没有被捕获,那么它看起来好像是在最后的大括号中发生的。
它的工作方式如下:
Closeable
是一个扩展AutoCloseable
而不声明任何已检查异常的接口。
ignore
只是告诉IntelliJ IDEA不要抱怨未使用的变量的名称,这是必要的,因为愚蠢的java不支持try( Debugger.newBreakSuppression() )
。
Debugger
是我自己的类,带有与调试相关的帮助方法。
newBreakSuppression()
是一个创建某个BreakSuppression
类的线程局部实例的方法,它会注意到我们希望临时暂停中断异常的事实。
然后我有一个带有中断条件的异常断点,它会调用我的Debugger
类来询问是否可以中断,而Debugger
类会响应&#34; no&# 34;如果实例化了任何BreakSuppression
个对象。
这非常复杂,因为VM在我的代码加载之前抛出了异常,因此在程序启动期间无法评估过滤器,并且调试器会弹出一个抱怨而不是忽略它的对话框。 (我不是在抱怨,我讨厌沉默的错误。)所以,我必须有一个可怕的,可怕的,不要尝试这种在家的黑客,其中休息条件看起来像这样:{{1}通常,这永远不会回来
是的,因为java.lang.System.err.equals( this )
不等于抛出异常,因此调试器永远不会中断。但是,当我的System.err
类被初始化时,它将用自己的类替换Debugger
,
它提供了System.err
的实现,如果调试器应该中断则返回equals(Object)
。所以,基本上,我使用true
作为永恒的全局变量。
最终我放弃了整个方案,因为它过于复杂并且表现非常糟糕,因为异常显然在java软件生态系统中经常被抛出,因此每次抛出异常时评估表达式都会大大减慢一切。
答案 2 :(得分:0)
答案 3 :(得分:0)
解决方案还有另一个答案: Debugging with pycharm, how to step into project, without entering django libraries
它对我有用,除了我仍然进入“_pydev_execfile.py”文件,但是在将它们添加到链接答案中的排除后我没有进入其他文件。