PythonでEOFError例外をキャッチ(捕捉)する方法を解説
EOFErrorとは?
EOFErrorは、input()などの組み込み関数が、入力ストリームの終端(End Of File)に達した時点でまだ何もデータを読み込めていない場合に発生する例外です。
一方で、ファイルオブジェクトのread()メソッドのように、ファイルの読み込み系メソッドでは、ファイルの末尾に到達しても例外は発生せず、代わりに空文字列が返されるという違いがあります。
EOFErrorを捕捉するサンプルコード
以下のコードでは、whileループ内で繰り返し標準入力を読み取り、try-except構文を使ってEOFErrorを捕捉しています。なお、ここではPython 3のinput()関数を使用します(Python 2では同等の機能を持つraw_input()が使われていました)。
# eof_error.py
try:
while True:
data = input('prompt:')
print('READ:', data)
except EOFError as e:
print(e)実行方法
ターミナルで以下のように、echoコマンドの出力をパイプ経由でスクリプトに渡して実行します。
$ echo hello | python eof_error.py
実行結果
prompt:READ: hello prompt:EOF when reading a line
動作の解説
この例では、1回目のループでinput()が「hello」という文字列を正常に読み込み、画面に表示します。しかし、2回目のループではもう読み取るべき入力データが存在しないため、input()はEOFErrorを発生させます。
except EOFError as e:の部分でこの例外を受け取り、変数eに格納されたエラーメッセージを出力することで、プログラムが異常終了せずに適切に処理を完了できるようになります。
このように、ユーザー入力やパイプ・リダイレクトからの標準入力を扱う場合は、入力の終端に達する可能性を考慮し、EOFErrorの捕捉を組み込んでおくことが堅牢なスクリプトを書くポイントです。
-
PythonでKeyError例外をキャッチする方法をわかりやすく解説
Pythonでは、辞書(dict)に存在しないキーを使って値へアクセスしようとすると、KeyError例外が発生します。この記事では、try-except文を使ってKeyErrorをキャッチし、例外の種類や詳細情報を確認する方法を解説します。 KeyErrorが発生する仕組み 次のコードは、辞書に存在しないキー c で値を取得しようとしているため、KeyErrorが発生します。sys.exc_info() を使うと、発生した例外の型などの情報を取得できます。 import sys try: s = {a: 5, b: 7}[c] except: print(sys.exc_i
-
Pythonのリスト内包表記で例外をキャッチするには?原因と対処法を解説
Pythonには、例外を処理したり無視したりするための組み込み関数は存在しません。そのため、リスト内包表記の中ですべての例外を処理することは不可能です。 その理由は、リスト内包表記が「式(expression)」で構成されている点にあります。例外のキャッチや無視、ハンドリングを行えるのは「文(statement)」である try〜except ブロックだけだからです。式の中に try-except を埋め込むことは、Pythonの文法上できません。 現実的な回避策:関数へ処理を委譲する この制限に対する実用的な解決策のひとつが、例外が発生しうる部分式の評価を「関数」に委譲する方法です。関数の中