2016-02-03 91 views
2

我要處理特定OSERROR代碼是這樣的:Python的用戶定義的異常處理特定OSERROR碼

try: 
    os.scandir() 
except OSPermissionError as error: 
    # Only catch errno.EACCES, errno.EPERM 
    handle_permission_error() 
except OSFileNotFoundError as error: 
    # Only catch errno.ENOENT 
    handle_FileNotFoundError_error() 

可這在Python做呢?

回答

1

你可以這樣做:

try: 
    os.scandir() 
except OSError as error: 
    if error.errno in (errno.EACCES, errno.EPERM): #Permission denied 
     handle_permission_error() 
    elif error.errno == errno.ENOENT: #File not found 
     handle_FileNotFoundError_error() 
    else: 
     raise 
+0

謝謝!這正是我寫代碼的方式。我希望我錯過了Exception的一些特性,但是從這些答案看來,在子類中沒有這樣的能力來包含errno測試。 – Buoy

5

os.scandir()不把這些類型的異常。它引發了OSError異常。但是,它確實可以確定發生的錯誤類型。

有一個large number of possible errors可能是OSError的一部分。你可以使用這些來提高你自己的custom exceptions,然後在堆棧中進一步處理它們。

class OSPermissionError(Exception): 
    pass 

class OSFileNotFoundError(Exception): 
    pass 

try: 
    os.scandir() 
except OSError as error: 
    # Not found 
    if error.errno == errno.ENOENT: 
     raise OSFileNotFoundError() 
    # Permissions Error 
    elif error.errno in [errno.EPERM, errno.EACCES]: 
     raise OSPermissionError() 
    else: 
     raise 
+0

謝謝!因此,事先將errno測試放入子類中並不奏效,嘆了口氣。 – Buoy