1. ホーム
  2. python

[解決済み] FileNotFoundErrorを正しく発生させるには?

2023-07-14 07:54:59

質問

サードパーティのライブラリを使用していますが、私が望むような方法で存在しないファイルを処理できません。存在しないファイルを与えるとき、古き良き時代の

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

これは "Syntax error in file None" よりも良いですが、再実装せずに、適切なメッセージで "real" Python 例外を発生させることはどのように可能でしょうか。

どのように解決するのですか?

引数を渡す。

import errno
import os

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

FileNotFoundError のサブクラスです。 OSError のサブクラスで、いくつかの引数を取ります。最初の引数は errno モジュール (ファイルが見つからない場合は常に errno.ENOENT ) 、2番目はエラーメッセージ ( os.strerror() を使って取得します)、3番目にファイル名を渡します。

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

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