2013-07-10 39 views
3

我想知道如何處理具有相同「類型」的不同異常。我試圖使用一些代碼來創建一個目錄:用不同的錯誤代碼處理異常

os.mkdir(target_dir_name) 

而且我知道這可能會失敗的原因有多種,例如,如果該目錄已經存在:

OSError: [Errno 17] File exists: 

,或者如果有沒有權限來創建一個新的目錄:

OSError: [Errno 13] Permission denied: 

我想我定製的錯誤消息,具體的故障原因,所以我想出了下面的代碼:

try: 
    os.mkdir(target_dir_name) 
except OSError as e: 
    if e.errno == 17: 
    print "Warning: Directory %s already exists, executing a rebuild" % (target_dir_name) 
    elif e.errno == 13: 
    sys.exit("Error: Directory "+target_dir_name+" cannot be created incorrect permissions") 

但我想做一些少硬編碼的東西。有沒有Pythonic的方法可以更新我的子失敗檢查?

+0

在Python 3.3,有錯誤得到了分成不同的類型:http://docs.python.org/3/whatsnew/3.3.html#pep-3151- reworking-the-os-and-io-exception-hierarchy – delnan

+0

我還沒有找到一個優雅的解決方案,因爲很多這些異常和錯誤類型對於它們的屬性都是非常特定的。所以一般在這種情況下,我通常會做什麼http://stackoverflow.com/a/16268642/158111建議 - 將特定的錯誤處理包裝到函數中,並避免重複的硬編碼。 – woozyking

+0

@delnan - 感謝您的意見。當我完成它時,這將是一個分佈式腳本,如果我可以幫助它的話,我不想將自己綁定到一個Python版本。我無法保證每個人都會運行,但我認爲2.7.3會非常安全(因爲這是最新的穩定Ubuntu版本的標準) – Mike

回答

0

我發現的唯一信息...我的猜測是我最好的答案:

隨着errno module我至少可以重寫我當前的代碼爲:

import errno 
#... 
except OSError as e: 
    if e.errno == errno.EEXIST: 
    print "Warning: Directory %s already exists, e..." 
    elif e.errno == errno.EACCESS: 
    sys.exit("Error: Directory "+target_dir_name+"..." 

如果我升級到python 3.2存在好得多:

except FileExistsError: 
    print ("Warning: Directory %s already exists, e...") 
except PermissionError: 
    sys.exit("Error: Directory "+target_dir_name+"...") 

看來我可以做一些花哨的使用sys.version_info.majorminor以確保它至少也是3.2

希望更好的東西上來了......