2017-06-12 61 views
0

既存のファイルを作成しようとしたときや存在しないファイルを使用しようとしたときに発生するエラーを処理するときには、スローされるOSErrorにサブクラスFileExistsError,FileNotFoundError)。ファイル名が長すぎると、特別なケースのサブクラスが見つかりませんでした。OSErrorを処理する方法:[Errno 36]ファイル名が長すぎます

正確なエラーメッセージは次のとおりです。ファイル名が長すぎるだけ

OSError: [Errno 36] File name too long: 'filename' 
私は、ファイル名が長すぎる場合に発生するOSErrorのをキャッチしたいと思います

が、

。私はではない他のキャッチする場合がありますOSErrorが発生する可能性があります。これを達成する方法はありますか?

編集:私は長さに対して、ファイル名を確認することができることを知っているが、最大ファイル名の長さがあまりにも多くのOSやファイルシステムによって異なり、私はそのように「クリーン」な解決策が表示されません。

+0

ロングファイル作成時の[Python IOError例外]の複製が可能です(https://stackoverflow.com/questions/4677234/python-ioerror-exception-when-creating-a-long-file) – NuclearPeon

+0

@ NuclearPeon:いいえそれは窓に特有のもので、そこの答えはこの質問に答えません。私は質問でそれを指定しました。 –

+0

最大ファイル名のパスを取得しようとすることはできますが、確実な方法はありません。このリンクをチェックしてください:https://code.activestate.com/lists/python-list/210662/ - ファイル名の長さを確認し、長すぎる場合はユーザーに通知してください。さもなければtry/exceptはすでにリストされているようにあなたの最善の策です。 – 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

@マックス:盛り上がりがそれを処理します。編集を参照してください。 – 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'は' if'例外が 'errno'属性と('!= ')等しくないという条件を設定しますが、あなたはそれを無視するコードを書いています。 'else'あなたは正しい例外を"捕まえました "...今は"処理 "します。 – pstatix

+0

私はそれを無視したくない!私はそれを捕まえたくありません。私は私の質問で、「私は、他のOSErrorが発生する可能性はありません。これを達成する方法はありますか?」と述べました。 もし 'errno'が' errno.ENAMETOOLONG'と等しくなければ、以前のエラーをさらに伝播させる方法があれば、それをあなたの答えに加えてください。しかし、現在私はあなたがそれを達成する計画を見ていません。 –

関連する問題