2012-08-15 97 views
5

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中有沒有一種方法可以讓調試器不會中斷拋出並在沒有任何代碼參與的情況下被捕獲的異常?

+0

有關Java的類似問題 - [在Java調試器中,如何忽略永遠不會通過我的代碼的異常](http://stackoverflow.com/q/3335587/95735) – 2013-03-03 13:19:01

回答

0

還有一個SO一個解決方案回答: Debugging with pycharm, how to step into project, without entering django libraries

這是爲我工作,除非我仍然進入「_pydev_execfile.py」文件,但是在將其添加到鏈接答案中的排除之後,我還沒有涉及到其他文件。

+0

是不是關於_Step into_函數而不是異常斷點的其他問題?或者這兩種方式能夠解決我的問題? – Feuermurmel 2013-04-22 15:20:43

+0

哦,對不起。我誤解了你的問題! – northben 2013-04-22 16:13:43

2

在PyCharm中,轉到運行 - >查看斷點,然後選中「On raise」和「忽略庫文件」。

screenshot of the options menu

的第一個選項使得每當產生一個異常調試器停止,而不是終止程序正當,而第二個選項使PyCharm忽略庫文件,因此主要公司中搜索代碼的策略。

由於CrazyCoderlink已找到解決方案,因此添加了功能請求。

1

有一段時間我有這涉及類似下面的一個複雜的方案:

try(Closeable ignore = Debugger.newBreakSuppression()) 
{ 
    ... library call which may throw ... 
} <-- exception looks like it is thrown here 

這讓我從沒被被扔進吞庫調用中的異常被人打擾。如果庫調用引發異常並且未捕獲到異常,則看起來好像它發生在最後一個大括號處。

它的工作方式如下:

Closeable是延伸AutoCloseable沒有宣佈任何checked異常的接口。

ignore只是一個名稱,告訴IntelliJ IDEA不要抱怨未使用的變量,並且這是必要的,因爲愚蠢的java不支持try(Debugger.newBreakSuppression())

Debugger是我自己的類與調試相關的輔助方法。

newBreakSuppression()是一種方法,它將創建一些BreakSuppression類的線程本地實例,該類將注意到我們希望暫時掛起異常的事實。

然後我有這將調用我的Debugger類來詢問是否是好的,打破了休息狀態的異常斷點,並Debugger類將有一個「不」,如果被實例化的任何BreakSuppression物體作出反應。

這非常複雜,因爲虛擬機在加載代碼之前會拋出異常,所以在程序啓動時無法評估過濾器,調試器會彈出一個對話框而不是忽略它。 (我不是抱怨這個,我討厭沉默的錯誤。)所以,我必須有一個可怕的,可怕的,不要試試這個在家破解的破解條件看起來像這樣:java.lang.System.err.equals(this)通常,這個將永遠不會返回 ,因爲System.err不等於拋出的異常,因此調試器永遠不會中斷。但是,當我的Debugger類將被初始化時,它將替換System.err與它自己的一個類 ,它提供了equals(Object)的實現並返回true如果調試器應該中斷。所以,基本上,我使用System.err作爲永恆的全球變量。

最終我放棄了這個整個方案,因爲它太複雜了,而且執行起來非常糟糕,因爲在Java軟件生態系統中異常顯然經常被拋出,所以每次拋出異常時評估一個表達式都會極大地減慢一切。

+1

提高投票率,因爲它讓我想起了我製造的東西_The Incredible Machine_。啊,好時光啊... – Feuermurmel 2016-11-18 00:23:23