2011-04-08 74 views
2

運行一些代碼時遇到了一個奇怪的問題。我正在玩在學校中完成的舊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的檢查異常)
  • 這是否會成爲bug報告的候選人?

這是在Visual Studio 2010 Pro上運行的IronPython 2.7 Stable(我剛安裝幾小時前)。我不記得以前的版本是否有問題,我從來沒有通過調試器試過代碼。

回答

3

這看起來像是.NET調試器和IronPython如何引發異常之間的奇怪交互。解決方法是進入「Debug - > Exceptions ...」窗口,單擊「Add ...」,然後添加IronPython.Runtime.Exceptions.PythonException作爲CLR異常。然後,清除「User-unhandled」複選框,它將告訴調試器忽略未捕獲的Python異常。

您也可以嘗試在Python Tools for Visual Studio下運行,看看它是否有不同的行爲。否則,請提交一個錯誤,以便我們至少知道它。

+0

這樣做。我沒有想到必須添加例外。我認爲安裝程序會這樣做,或者至少它會被列出。儘管現在問題是調試器不會報告任何合法未捕獲的異常。 – 2011-04-08 18:57:15

+0

[已報道](http://ironpython.codeplex.com/workitem/30502)。 – 2011-04-08 19:40:23

+0

我也遇到過這個問題,並且我已經將這個報告轉發到http://pytools.codeplex.com/workitem/358的pytools codeplex,希望能夠吸引更多人關注這個問題。 – Aphex 2011-07-14 20:44:37