2016-09-14 103 views
2

TL; DR:當模塊沒有記錄所有錯誤時要捕捉哪種錯誤?模塊沒有記錄其所有錯誤時要捕捉哪些錯誤? (plistlib)

方案

我試圖讀取使用plistlib一系列property lists。我無法控制這些文件。如果文件無法讀取,我想跳過它。

我的問題是什麼樣的錯誤,我應該追上?

plistlib.readPlist文件IOErrorxml.parsers.expat.ExpatError

但我也可以生成至少IndexErrorAttributeError只是通過malforming我的輸入文件。這些沒有記錄在plistlib。誰知道其他隨機輸入文件可能產生哪種附加錯誤?我不希望我的程序因此而失敗。

所以我的問題是。我應該抓住什麼?我的理解是,使用通用except捕獲任何錯誤不是首選,因爲它掩蓋了其他錯誤,如KeyboardInterrupt。由於這是一個命令行應用程序,我不想忽略這些事件。

代碼

import plistlib 
import sys 

def main(): 
    paths = [] # from sys.argv 

    for path in paths: 
     try: 
      plist = plistlib.readPlist(path) 
     except: # What to catch here? 
      sys.stderr.write('Couldnt read plist. Ignoring.') 
      continue 

     process(plist) 

的Python 2.7,OS X.

+1

'除例外:'或'除非例外爲e:'可能是最常見的方式來處理未知異常類型,史蒂夫如下建議。另一個選擇是隻有一個'except:',然後在except塊中使用'e = sys.exc_info()[0]'來檢索異常實例[[1](https://wiki.python.org/)莫因/ HandlingExceptions)]。我想結果應該非常相似。 –

+0

謝謝。我正在尋找最佳做法來處理這個問題。這有幫助! – tombardey

+1

另一個最佳做法是簽出庫的源代碼並搜索'rsise'來清除異常。 –

回答

3

如果你不能做的更好,然後except Exception:避免趕上KeyboardInterruptSystemExit

但它確實趕上StopIterationGeneratorExit。也許你可以安全地上下移動,以捕捉StandardError(不包括那些),因爲它通常會被認爲是錯誤的,不是一個迭代器以外的任何代碼,讓StopIteration逃生。但是誰知道,也許有一些輸入會導致圖書館在枯竭的迭代器上調用next,而不能捕捉到。

StandardError仍然捕獲SyntaxErrorTypeError,這往往是程序員錯誤,而不是錯誤輸入的指標。但是有映入都LookupErrorMemoryError(這兩者將是適當的在這裏釣),而不是SyntaxError沒有單一類。所以,只要你沒有文檔或廣泛的測試,就可以去確定代碼真正拋出什麼。

請注意,MemoryError不足以知道錯誤是暫時的(它可能在另一天或另一臺機器上工作)或永久性的(輸入文件太大以至於沒有可以想象的機器能夠處理它)。

+0

謝謝,這個幫助很大。我已經使用Python進行輕量級腳本編寫了一段時間,但從未真正花時間正確地學習它。您的回答讓我有機會深入瞭解異常層次結構。我沒有意識到'BaseException'和'Exception'之間的區別。這已經是一個很好的區別了。現在,我會用'StandardError'去。 – tombardey