PythonでStopIteration例外をキャッチする方法を解説
Pythonでは、イテレータがすべての要素を出力し終えた後に次の要素を要求すると、next()メソッド(Python 3では__next__())がStopIteration例外を発生させます。この例外はエラーではなく、イテレータの終端に達したことを示す正常なシグナルとして扱われます。
StopIteration例外とは
StopIterationは組み込み例外の一つで、forループなどが内部的にイテレータの終了を検知するために利用しています。そのため、通常は意識する必要がありませんが、next()を直接呼び出す場合や、ジェネレータを扱う場合には、この例外を明示的にキャッチして処理することがあります。
StopIteration例外をキャッチするコード例
以下のコードでは、リストから作成したイテレータに対してnext()を繰り返し呼び出し、要素を使い果たした時点で発生するStopIteration例外をtry-exceptブロックでキャッチしています。あわせて、例外の種類も出力して確認できるようにしています。
import sys
try:
z = [5, 9, 7]
i = iter(z)
print(i)
print(next(i))
print(next(i))
print(next(i))
print(next(i)) # 要素が尽きたためStopIterationが発生
except Exception as e:
print(e)
print(type(e).__name__)
実行結果
<list_iterator object at 0x0000000002AF23C8> 5 9 7 StopIteration
コードのポイント
iter(z)でリストからイテレータオブジェクトを作成します。next(i)を呼び出すたびに、リストの要素が先頭から順に返されます。- 4回目の
next(i)の時点で要素が残っていないため、StopIteration例外が発生し、exceptブロックに制御が移ります。 type(e).__name__により、捕捉した例外がStopIterationであることを確認できます。
補足:next()のデフォルト値を活用する方法
例外処理を書かずに済ませたい場合は、next()の第2引数にデフォルト値を指定する方法もあります。イテレータが終端に達したときに、例外の代わりにそのデフォルト値が返されます。
z = [5, 9, 7] i = iter(z) print(next(i, None)) # 5 print(next(i, None)) # 9 print(next(i, None)) # 7 print(next(i, None)) # None(例外は発生しない)
このように、状況に応じてtry-exceptによる明示的な例外処理と、デフォルト値による簡潔な記述を使い分けることで、より安全で読みやすいコードを書くことができます。
-
PythonでIOError例外をキャッチする方法【初心者向けにわかりやすく解説】
IOError例外とは? IOError(入出力エラー)は、入出力操作が失敗したときに発生する例外です。代表的な例としては、存在しないファイルをopen()関数で開こうとした場合や、OSに関連するエラーが発生した場合などが挙げられます。 なお、Python 3ではIOErrorはOSErrorの別名(エイリアス)となっており、どちらの名前で捕捉しても同じ例外を受け取ることができます。 try-exceptブロックで例外を処理する ファイルを開く処理などをtryブロック内に記述すると、入出力例外が発生した際にexceptブロックで適切に処理できます。以下に具体的なコード例を示します。 コード例(
-
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