这是我在运行一些代码时遇到的一个奇怪的情况。我正在玩我在学校做过的旧 Python 作业 - 将它们嵌入到 C# 程序中,使用 IronPython 运行它们,等等。
嵌入代码的效果正如我所期望的那样,在 IronPython 交互中运行时也是如此。然后我在一个新的 IronPython 项目中运行它,发现了一些尴尬的行为。在没有调试的情况下运行代码给出了正常的行为。运行与调试开始发出未处理的异常错误(在查看之后发现这只是警告,稍后会详细介绍)。
这对我来说是一个令人头疼的事情。单步调试代码,我发现一切都按照我的预期发生。然而,在某些时候,它会停止并显示未处理的异常窗口,指向代码中看似随机的部分。为了找出问题所在,我想出了以下代码:
from __future__ import print_function
def raiser():
print('raising an exception')
raise Exception() # unreported exception here
if __name__ == '__main__':
try:
raiser()
except Exception: # but is handled here
print('caught it')
#raiser() # ignoring exceptions would leave this unreported
现在这里发生的事情应该非常明显了。不调试运行即可正常运行。通过调试运行它,它停止,表明存在未处理的异常。它已被处理,只是不在raiser()
函数的范围内。就在那时我意识到这是一个警告...为了这么简单的事情而疯狂地追逐了两个小时。
- 能否以某种方式禁用或抑制此警告?
现在,我可能会期望这种警告对于需要获得所有帮助的初学者来说,但我在这方面远非初学者,并且不关心当前函数范围内未处理异常,只是它在我的代码中的某个地方进行了处理。我找不到任何对此的在线引用或 Visual Studio 中的任何设置。
- 是否有一些新的要求必须声明将为调试器引发异常?
(类似于Java的检查异常) - 这会成为错误报告的候选者吗?
这是在 IronPython 2.7 Stable(我几个小时前刚安装的)上运行的 Visual Studio 2010 Pro。我不记得这在以前的版本中是否曾出现过问题,当时我从未通过调试器尝试过代码。
最佳答案
这看起来像是 .NET 调试器与 IronPython 异常引发方式之间的奇怪交互。解决方法是进入“调试 -> 异常...”窗口,单击“添加...”,然后添加 IronPython.Runtime.Exceptions.PythonException
作为 CLR 异常。然后,清除“用户未处理”复选框,这将告诉调试器忽略未捕获的 Python 异常。
您也可以尝试在 Python Tools for Visual Studio 下运行相反,看看它是否有不同的行为。否则,请提交一个错误,以便我们至少知道它。
关于exception - 调试时如何忽略当前函数中未捕获的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5594375/