【问题标题】:debugging a wxPython application under PyCharm leads to termination on every unhandled exception在 PyCharm 下调试 wxPython 应用程序会导致每个未处理的异常终止
【发布时间】:2020-04-08 19:41:48
【问题描述】:

在 wxPython 下,当主循环中出现未处理的异常时,会打印回溯并忽略异常。 在 PyCharm 下调试时并非如此。然后未处理的异常导致进程终止。 此外,这是新的行为,因为之前版本的 PyCharm 并没有这种行为。

拿下面的测试代码:

import wx
import wx.lib.sized_controls as sc

def Raise(evt=None):
    raise Exception('error')

app = wx.App()
frame = sc.SizedFrame(None,-1,'hello')
p = frame.GetContentsPane()
b = wx.Button(p,-1,'press')
frame.Bind(wx.EVT_BUTTON,Raise,b)
frame.Show()
app.MainLoop()

在运行时按下按钮通常会导致打印并忽略异常。 在 PyCharm 调试模式下运行时,进程终止。 有没有办法改变这种行为?

Windows10、Python3.6、wxPython 4.0.4、PyCharm 2019.3

【问题讨论】:

  • 现在从 2019.1 版本开始,这已被验证为 PyCharm(回归)中的一个错误。 2018.x 版本不受影响。如果有人想观看,请链接到此处发布的问题:youtrack.jetbrains.com/issue/PY-40039

标签: python debugging pycharm wxpython


【解决方案1】:

与大多数 Python 调试器一样,PyCharm 将自己的异常处理程序安装为 sys.excepthook,因此,只要正常运行和调试器运行之间存在不同的行为,就可以开始查找。例如,如果您查看项目的断点列表,您还会看到用于中断异常的选项。这些东西是在新的excepthoot 函数中实现的。如果一切都失败了,您可以查看 PyCharm 用于启动和与被调试者通信的 pydev 代码,并查看它在异常钩子相关代码中的作用,这可能会提供一些关于如何解决此问题的线索。

我不再使用它了,所以我可能记错了,但我似乎记得 PyCharm 中有一个选项可以停止或忽略未处理的异常,或者可能忽略从特定位置引发的异常,但是我现在两个都没有看到。

OTOH,在事件处理程序或其他回调函数结束之前捕获异常总是一个好主意。

【讨论】:

  • 我也认为这是 PyCharm 调试模式的问题。我已经在他们的问题跟踪器上提交了一个问题。希望他们能对此有所作为。这是我在问题中发布的最小测试代码: import wx app = wx.App() wx.Frame(None).Show() wx.CallAfter(lambda: 1/0) app.MainLoop() 它在 PyCharm 调试时终止但在没有 PyCharm 的情况下运行时不会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多