2017-06-12 460 views
0

當處理嘗試創建現有文件時發生的錯誤或嘗試使用不存在的文件時,拋出的OSError有一個子類( FileExistsErrorFileNotFoundError)。當文件名太長時,我找不到特殊情況下的子類。如何處理OSError:[Errno 36]文件名太長

確切的錯誤信息是:

OSError: [Errno 36] File name too long: 'filename' 

我想趕在文件名過長時出現的OSERROR,但只有當文件名過長。我做不是想抓其他可能發生的OSError。有沒有辦法做到這一點?

編輯:我知道我可以根據長度檢查文件名,但最大文件名長度根據操作系統和文件系統而變化太大,我沒有看到這樣的「乾淨」解決方案。

+0

[Python IOError異常,當創建一個長文件]可能重複(https://stackoverflow.com/questions/4677234/python-ioerror-exception-when-creating-a-long-file) – NuclearPeon

+0

@NuclearPeon:否這是Windows特有的,那裏的答案不能回答這個問題。我在這個問題中指出了這一點。 –

+0

您可以嘗試獲取最大文件名路徑,但沒有辦法做到這一點。檢查此鏈接:https://code.activestate.com/lists/python-list/210662/ - 檢查文件名的長度,並通知用戶是否太長。否則,嘗試/除了是你已經列出的最好的賭注。 – NuclearPeon

回答

3

只需檢查errno捕獲異常的屬性。

try: 
    do_something() 
except OSError as exc: 
    if exc.errno == 36: 
     handle_filename_too_long() 
    else: 
     raise # re-raise previously caught exception 

爲了提高可讀性,你可以考慮使用適當的常量從errno built-in module而不是硬編碼不變。

+0

偉大的思想思考和一起發佈! – pstatix

+0

但是後來我也抓住了另外一個'OSError',我特別不想抓到! –

+0

@Max:加註會照顧到這一點。查看編輯。 – zondo

1

可以指定你是多麼想趕上一個特定的錯誤,如errno.ENAMETOOLONG

具體到你的問題...

try: 
    # try stuff 
except OSError as oserr: 
    if oserr.errno != errno.ENAMETOOLONG: 
     # ignore 
    else: 
     # caught...now what? 

具體到您的意見...

try: 
    # try stuff 
except Exception as err: 
    # get the name attribute from the exception class 
    errname = type(err).__name__ 
    # get the errno attribute from the exception class 
    errnum = err.errno 
    if (errname == 'OSError') and (errnum == errno.ENAMETOOLONG): 
     # handle specific to OSError [Errno 36] 
    else if (errname == 'ExceptionNameHere' and ...: 
     # handle specific to blah blah blah 
    . 
    . 
    . 
    else: 
     raise # if you want to re-raise; otherwise code your ignore 

這將捕獲由0中的錯誤引起的所有異常。然後它檢查__name__是否與任何特定的異常以及您要指定的其他條件匹配。

如果遇到錯誤,除非您指定了具體的異常,否則您應該知道沒有繞過except

+0

但是後來我也抓住了另一個'我特別不想抓到的OSError'! –

+0

@MaxMatti爲了「捕捉」和錯誤,你必須「處理」它。 'if/else'設置條件,如果'例外'errno'屬性不等於('!='),則你編寫代碼來忽略它(然而你選擇這樣做)。 'else'你已經「抓住」了正確的例外......現在「處理」它。 – pstatix

+0

我不想忽視它!我想不去捕捉它。我在我的問題中指出:「我不希望捕獲可能發生的其他'OSError',是否有辦法實現這一點?」 如果有一種方法可以讓以前的錯誤進一步傳播,如果'errno'不等於'errno.ENAMETOOLONG',請將其添加到您的答案。但目前我看不出你打算如何實現這一目標。 –

相關問題