调试时如何忽略当前函数中未捕获的异常?

时间:2011-04-08 11:29:05

标签: exception-handling debugging ironpython

这是我在运行一些代码时遇到的奇怪之处。我正在玩我在学校里完成的旧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()函数的范围内。就在那时,我意识到这是一个警告 ......在追逐这么简单的事情上疯狂追逐2个小时。

  • 可以以某种方式禁用或禁止此警告吗?

现在这种警告对于初学者来说可能会有所期待,他们需要他们能得到的所有帮助,但我在这方面远非初学者而且不关心在当前函数范围内没有处理异常,只是在我的代码中处理某处。我在Visual Studio中找不到任何对此在线或任何设置的引用。

  • 是否有一些新的要求必须声明将为调试器引发异常?
    (类似于Java的已检查异常)
  • 这会成为错误报告的候选人吗?

这是在使用Visual Studio 2010 Pro的IronPython 2.7 Stable(我刚刚安装几小时)。我不记得在以前的版本中这是否曾经是一个问题,我从未通过调试器尝试过代码。

1 个答案:

答案 0 :(得分:3)

这看起来像是.NET调试器与IronPython异常引发之间的奇怪交互。解决方法是进入“Debug - > Exceptions ...”窗口,单击“Add ...”,然后添加IronPython.Runtime.Exceptions.PythonException作为CLR异常。然后,清除“User-unhandled”复选框,它将告诉调试器忽略未捕获的Python异常。

您也可以尝试在Python Tools for Visual Studio下运行,看看它是否有不同的行为。否则,请提交一个错误,以便我们至少知道它。