2013-02-22 2 views
38

私は、(開くべきファイルの)ファイル名を入力するためのプロンプトが表示され、そのファイルが現在のディレクトリに存在しない場合は、再度プロンプトが表示されます。 (それは「期待」の下にスイートを実行)私はわざと間違ったファイル名を入力すると、それは完全に罰金働い3.3倍Pythonの "open()"は "ファイルが見つかりません"という異なるエラーを投げます - 両方の例外をどのように処理するのですか?

file = input("Type filename: ") 

... 
try: 
    fileContent = open(filename, "r") 
    ... 
except FileNotFoundError: 
    ... 

私はPythonで私のMacOS X上で私のスクリプトをテストする場合:ここではショートバージョンがあります。

しかし、コード をPython 3.2xのWindowsコンピュータで実行したいとき、「FileNotFoundError」が定義されていないというエラーが表示されます。したがって、WindowsのPython 3.2では、 "FileNotFoundError"が変数であると考えられ、プログラムはエラーで終了します。

私は、入力ファイル名が有効でない場合、WindowsのPython 3.2では "IOError"がスローされることを知りました。私はLinuxマシンでPython 2.7でテストしましたが、IOErrorでもあります。

私の問題は

except "FileNotFoundError": 

とのコードは、WindowsのPythonの3.2上で実行されませんが、私は

except "IOError": 

に変更した場合、それは私のMac上で動作しないこと、今ありますもう

どうすれば回避できますか?私が考えることができる唯一の方法は、私が通常望まない、 exceptを使うことです。

+6

これはMac/Windowsのためではありません。これはPythonの*バージョン*です。私はOS Xでも3.2/3.3を調査し(Windowsでは3.3)、変更ログを参照して、必要に応じて質問/タイトルを修正します。 –

答えて

56
3.3では

IOError became an alias for OSError、およびFileNotFoundErrorはのサブクラスでないを検査するために、より多くの雄弁解決策があると願っていますOSError。ですから、

except (OSError, IOError) as e: 
    ... 

を試みるかもしれないこれはかなり広いネットをキャストします、とあなたはe.errnoを検査せずに例外は、「ファイルが見つかりません」されると仮定することはできませんが、それはあなたのユースケースをカバーすることができます。

PEP 3151は、変更の根拠について詳細に議論している。

2

私はそれはあなたが求めていたものであることに気づかなかった

except (FileNotFoundError, IOError):

同時に2つのエラーをキャッチすることができます。私は手動で

try: 
    error_to_catch = FileNotFoundError 
except NameError: 
    error_to_catch = IOError 

except error_to_catch

cwallenpooleはこの条件より雄弁に彼の答えで (error_to_catch = getattr(__builtins__,'FileNotFoundError', IOError))

+2

これは、* FileNotFoundErrorが定義されていないというエラーが表示されます。だから、WindowsのPython 3.2では "FileNotFoundError"は変数だと思ってプログラムはエラーで終了する* - ? –

+0

@pst興味深い申し訳ありませんそれを考慮していません – dm03514

7

これは、単純なexcept:よりも良いとして私を打つが、私はそれが最善の解決策であるかどうかわからないんだけど:

error_to_catch = getattr(__builtins__,'FileNotFoundError', IOError) 

try: 
    f = open('.....') 
except error_to_catch: 
    print('!') 
+0

他のニュース 'except:'の後にカンマがついていますが、文法的には正しいですが、まだ非常に奇妙です。 – cwallenpoole

+0

それはまたとても良い解決策です。 'except(IOError、OSError):'より少し長くなりますが、より具体的です –

3

だから、正確にファイルが見つからないときにのみ、私はキャッチする:

import errno 
try: 
    open(filename, 'r') 
except (OSError, IOError) as e: # FileNotFoundError does not exist on Python < 3.3 
    if getattr(e, 'errno', 0) == errno.ENOENT: 
     ... # file not found 
    raise 
関連する問題