6

我使用的 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 中,有没有办法让调试器在不涉及我的代码的情况下在库中抛出和捕获的异常不会中断?

4

4 回答 4

5

在 PyCharm 中,转到 Run-->View Breakpoints,然后选中“On raise”和“Ignore library files ”。

选项菜单的屏幕截图

第一个选项使调试器在引发异常时停止,而不是仅在程序终止时停止,第二个选项为 PyCharm 提供忽略库文件的策略,从而主要在您的代码中搜索。

由于CrazyCoder的功能请求链接已被添加,因此找到了解决方案。

于 2016-01-17T14:03:19.953 回答
1

有一段时间,我有一个复杂的计划,其中涉及以下内容:

try( Closeable ignore = Debugger.newBreakSuppression() )
{
   ... library call which may throw ...
} <-- exception looks like it is thrown here

这让我永远不会被库调用中抛出和吞没的异常所困扰。如果一个异常被库调用抛出并且没有被捕获,那么它看起来好像它发生在右大括号处。

它的工作方式如下:

CloseableAutoCloseable是一个在没有声明任何检查异常的情况下扩展的接口。

ignore只是一个名称,告诉 IntelliJ IDEA 不要抱怨未使用的变量,这是必要的,因为愚蠢的 java 不支持try( Debugger.newBreakSuppression() ).

Debugger是我自己的类,带有调试相关的辅助方法。

newBreakSuppression()是一种方法,它将创建某个BreakSuppression类的线程本地实例,它会注意到我们希望中断异常被暂时挂起的事实。

然后我有一个带有中断条件的异常断点,它将调用我的Debugger类来询问是否可以中断,如果实例化了任何对象,Debugger该类将以“否”响应。BreakSuppression

这非常复杂,因为虚拟机在我的代码加载之前抛出异常,因此在程序启动期间无法评估过滤器,并且调试器会弹出一个对话框抱怨而不是忽略它。(我不是在抱怨,我讨厌无声的错误。)所以,我必须有一个可怕的,可怕的,不要在家里尝试这个的破解,中断条件看起来像这样:java.lang.System.err.equals( this ) 通常,这会从不返回 true,因为System.err不等于抛出异常,因此调试器永远不会中断。但是,当我的Debugger类被初始化时,它将替换System.err为它自己的一个类,它提供了一个实现equals(Object)true在调试器中断时返回。所以,基本上,我正在使用System.err作为一个永恒的全局变量。

最终我放弃了整个方案,因为它过于复杂并且性能很差,因为在 Java 软件生态系统中显然经常抛出异常,所以每次抛出异常时评估一个表达式会极大地减慢一切。

于 2016-11-17T22:30:54.583 回答
0

此功能尚未实现,您可以投票:

于 2012-08-15T10:08:14.047 回答
0

解决方案还有另一个 SO 答案: Debugging with pycharm, how to step into project, without enter django library

它对我有用,除了我仍然进入“_pydev_execfile.py”文件,但在将它们添加到链接答案中的排除项后,我没有进入其他文件。

于 2013-04-22T01:25:53.230 回答