Python 3組み込み例外を必要とするプロジェクトでPython 2を現在使用しています:FileNotFoundError
。どうすればよいですか?
もちろん、必要な例外を定義できます。
しかし、彼らはあなたに何の役にも立たないでしょう。 FileNotFoundError
の要点は、ファイルが見つからないというエラーが発生したPython操作はその例外を発生させることです。独自の例外を定義するだけでは、それは真になりません。取得するのは、適切なOSError
値を持つIOError
(または2.xバージョンによってはerrno
)です。カスタムを処理しようとすると、 FileNotFoundError
、ハンドラーが呼び出されることはありません。
だから、あなたが本当に欲しいのは(例えば)です:
try:
f = open(path)
except OSError as e:
if e.errno == errno.ENOENT:
# do your FileNotFoundError code here
else:
raise
代わりに IOError
を使用できます:
I/O操作(printステートメント、組み込みのopen()関数、ファイルオブジェクトのメソッドなど)がI/O関連の理由で失敗したときに発生しますeg 、「ファイルが見つかりません」または「ディスクがいっぱいです」。
このクラスはEnvironmentErrorから派生しています。例外インスタンス属性の詳細については、上記の説明を参照してください。
バージョン2.6で変更:これを基本クラスとして使用するようにsocket.errorを変更しました。
FileNotFoundError
例外を自分で作成するだけです。
class FileNotFoundError(OSError):
pass
この新しい例外クラスは、Python 3.xの場合と同様に、OSError
から継承されます。
Pythonの ser-defined Exceptions のリファレンスです。
短い答え:EnvironmentError
を使用し、err.errno == errno.ENOENT
でPython 2またはPython 3.)のいずれかを確認してください
長い答え:
他の回答が述べたように、FileNotFoundError
はPython 3。
Python 2はOSError
(または2.xバージョンに応じてIOError
)を使用しました。 OSError
とIOError
はどちらもEnvironmentError
を継承しています。
Python 3では、EnvironmentError
はOSError
からエイリアスされます。FileNotFoundError
はOSError
から継承されます。つまり、FileNotFoundError
はEnvironmentError
でキャッチされ、OSError
およびIOError
と同じインターフェイスを共有します。
いいニュースです!これは、プロジェクトをPython 2とPython 3の両方に同時に対応させるための比較的簡単な方法があることを意味します。FileNotFoundError
は除外してください。 EnvironmentError
をキャッチします。
# Works for Python 2. Also works for Python 3.
import errno
try:
open("fake.file", 'r')
except EnvironmentError as err:
if err.errno == errno.ENOENT: # ENOENT -> "no entity" -> "file not found"
print("Caught 'file not found' exception")
else:
raise