【问题标题】:Ignore exceptions thrown and caught inside a library忽略在库中抛出和捕获的异常
【发布时间】:2012-08-11 13:40:15
【问题描述】:

我使用的 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 中是否有一种方法可以让调试器在不涉及我的代码的情况下不会中断在库中抛出和捕获的异常?

【问题讨论】:

标签: python debugging exception pycharm


【解决方案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 类来询问是否可以中断,如果有任何 BreakSuppression 对象,Debugger 类将响应“否”实例化。

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

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

【讨论】:

  • 赞成这个,因为它让我想起了我在 The Incredible Machine 中构建的东西。啊,美好的时光……
【解决方案2】:

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

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

感谢CrazyCoder's link 的功能请求,找到了解决方案,该请求已被添加。

【讨论】:

    【解决方案3】:

    还有另一个带有解决方案的 SO 答案: Debugging with pycharm, how to step into project, without entering django libraries

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

    【讨论】:

    • 这不是关于Step into 函数而不是异常断点的其他问题吗?或者这两者是否以某种方式解决了我的问题?
    【解决方案4】:

    这个功能还没有实现,你可以投票给它:

    【讨论】:

    • 看来我已经这样做了:)。其他人如何解决这个问题?我目前没有看到任何其他方法,除了每次调试器因此类异常中断时点击继续按钮。
    猜你喜欢
    • 2013-06-24
    • 2018-03-09
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    相关资源
    最近更新 更多