49

ユーザーが(開くファイルの)ファイル名を入力するように求められ、ファイルが現在のディレクトリに存在しない場合は、ユーザーに再度プロンプトが表示されるスクリプトがあります。これが短いバージョンです:

file = input("Type filename: ")

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

Python3.3xのMacOSXでスクリプトをテストしたとき、意図的に間違ったファイル名を入力すると、完全に正常に機能しました(「expect」の下でスイートが実行されます)。

ただし、Python 3.2xのWindowsコンピューターでコードを実行しようとすると、「FileNotFoundError」が定義されていないというエラーが表示されます。そのため、Windows上のPython 3.2は、「FileNotFoundError」が変数であると見なし、プログラムがエラーで終了します。

入力ファイル名が有効でない場合、Windows上のPython3.2が「IOError」をスローすることがわかりました。Python 2.7のLinuxマシンでテストしましたが、これもIOErrorです。

私の問題は今、

except "FileNotFoundError":

WindowsのPython3.2では実行されませんが、次のように変更すると

except "IOError":

私のMacではもう動作しません。

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

4

4 に答える 4

9

これは単純な よりも優れているexcept:と思いますが、それが最善の解決策であるかどうかはわかりません:

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

try:
    f = open('.....')
except error_to_catch:
    print('!')
于 2013-02-22T20:13:54.907 に答える
2

同時に2つのエラーをキャッチできます

except (FileNotFoundError, IOError):

それがあなたが求めていたものだとは思いませんでした。手動で検査するよりも雄弁な解決策があることを願っています

try:
   error_to_catch = FileNotFoundError
except NameError:
   error_to_catch = IOError

except error_to_catch

cwallenpooleは、彼の回答でこれをより雄弁に条件付けています (error_to_catch = getattr(__builtins__,'FileNotFoundError', IOError))

于 2013-02-22T19:49:24.753 に答える