Python
 Computer >> コンピューター >  >> プログラミング >> Python

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による明示的な例外処理と、デフォルト値による簡潔な記述を使い分けることで、より安全で読みやすいコードを書くことができます。

  1. PythonでIOError例外をキャッチする方法【初心者向けにわかりやすく解説】

    IOError例外とは? IOError(入出力エラー)は、入出力操作が失敗したときに発生する例外です。代表的な例としては、存在しないファイルをopen()関数で開こうとした場合や、OSに関連するエラーが発生した場合などが挙げられます。 なお、Python 3ではIOErrorはOSErrorの別名(エイリアス)となっており、どちらの名前で捕捉しても同じ例外を受け取ることができます。 try-exceptブロックで例外を処理する ファイルを開く処理などをtryブロック内に記述すると、入出力例外が発生した際にexceptブロックで適切に処理できます。以下に具体的なコード例を示します。 コード例(

  2. 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