web-dev-qa-db-ja.com

FileNotFoundErrorを適切に発生させるにはどうすればよいですか?

サードパーティのライブラリを使用しますが、それは問題ありませんが、存在しないファイルを希望どおりに処理しません。古き良きものを上げるのではなく、存在しないファイルを与えるとき

_FileNotFoundError: [Errno 2] No such file or directory: 'nothing.txt'
_

あいまいなメッセージが表示されます。

_OSError: Syntax error in file None (line 1)
_

不足しているファイルを処理したくない、例外をキャッチしたり処理したりしたくない、カスタム例外を発生させたくない、ファイルをopenしたい、作成したくないそれは存在しません。

私はそれが存在することを確認したいだけです(os.path.isfile(filename)はトリックを行います)、そうでない場合は、適切なFileNotFoundErrorを発生させます。

私はこれを試しました:

_#!/usr/bin/env python3

import os

if not os.path.isfile("nothing.txt"):
    raise FileNotFoundError
_

出力のみ:

_Traceback (most recent call last):
  File "./test_script.py", line 6, in <module>
    raise FileNotFoundError
FileNotFoundError
_

これは「ファイル内の構文エラーなし」よりも優れていますが、再実装することなく、適切なメッセージで「本当の」python例外を発生させることができますか?

36
zezollo

引数を渡す:

_import errno
import os

raise FileNotFoundError(
    errno.ENOENT, os.strerror(errno.ENOENT), filename)
_

FileNotFoundErrorOSError のサブクラスで、いくつかの引数を取ります。最初は errnoモジュール (見つからないファイルは常に_errno.ENOENT_)からのエラーコード、2番目はエラーメッセージ( os.strerror() これを取得するには)、ファイル名を3番目として渡します。

トレースバックで使用される最終的な文字列表現は、これらの引数から構築されます。

_>>> print(FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), 'foobar'))
[Errno 2] No such file or directory: 'foobar'
_
64
Martijn Pieters