このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Python入門】様々なexcept節の定義

様々なexcept節の定義

 プログラム実行中に予期せぬエラーが発生すると、通常はプログラムが停止してしまいます。try文とexcept節を用いると、本来の処理の流れを乱すことなく、エラー発生時に適切な対処を行うことができます。ここでは、様々なexcept節の定義方法について、具体的なコード例と表を交えて解説し、エラー処理の柔軟性を高める方法を学びます。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.try文と基本のexcept節

1.1. try節の役割

 try節は、例外が発生する可能性のある処理をまとめて記述するブロックです。try節内でエラーが発生しなければ、すべての処理が順に実行され、except節は無視されます。

1.2. 単一のexcept節によるエラー処理

基本的な構文は以下の通りです。

try:
    # エラーが発生する可能性のある処理
except ExceptionType:
    # エラー発生時の処理

【例】数値入力と逆数計算のプログラム
 以下は、ユーザーから数値を入力させ、その逆数を計算するプログラムです。ここでは、入力値が0の場合にZeroDivisionErrorが発生し、except節でエラーメッセージを表示します。

while True:
    try:
        # ユーザーから数値を入力し、floatに変換する
        num = float(input("Enter a number: "))
        # 入力値の逆数を計算して表示
        print("Reciprocal:", 1 / num)
    except ZeroDivisionError:
        # 0が入力された場合の処理
        print("Error: Cannot compute reciprocal of zero.")
    print("-" * 25)

実行結果

Enter a number:  10
Reciprocal: 0.1
-------------------------
Enter a number:  0
Error: Cannot compute reciprocal of zero.
-------------------------

解説

  • try節内で、ユーザー入力をfloatに変換し、逆数を計算しています。
  • 入力値が0の場合、ZeroDivisionErrorが発生し、except節で「Error: Cannot compute reciprocal of zero.」と表示されます。
  • エラーが発生しなければ、逆数が正常に表示され、区切り線が出力されます。

2.様々なexcept節の定義方法

2.1. 複数の例外をまとめて処理する

 複数の例外を1つのexcept節でまとめて処理する場合、例外クラスをタプルで指定します。以下の構文をご覧ください。

except (ExceptionA, ExceptionB):
    # 例外Aまたは例外Bが発生した場合の処理

【例】数値変換と逆数計算の例(複数例外をまとめる)

while True:
    try:
        num_str = input("Enter a number: ")
        num = float(num_str)
        print("Reciprocal:", 1 / num)
    except (ValueError, ZeroDivisionError):
        # ValueError(数字に変換できない)またはZeroDivisionError(0で割る)が発生した場合
        print("Error: Invalid input or division by zero.")
    print("-" * 25)

実行結果

Enter a number:  10
Reciprocal: 0.1
-------------------------
Enter a number:  2
Reciprocal: 0.5
-------------------------
Enter a number:  abc
Error: Invalid input or division by zero.
-------------------------
Enter a number:  10
Reciprocal: 0.1
-------------------------
Enter a number:  0
Error: Invalid input or division by zero.
-------------------------

解説

  • ユーザーの入力が数値に変換できない場合はValueError、入力値が0の場合はZeroDivisionErrorが発生します。
  • これらの例外を1つのexcept節でまとめ、共通のエラーメッセージを表示しています。

2.2. 例外オブジェクトの取得と利用

 except節で例外オブジェクトを変数として受け取ることで、発生したエラーの詳細情報を利用できます。構文は以下の通りです。

except ExceptionType as e:
    # 変数eに例外オブジェクトが格納される

【例】例外オブジェクトを表示する例

while True:
    try:
        num_str = input("Enter a number: ")
        num = float(num_str)
        print("Reciprocal:", 1 / num)
    except Exception as e:
        # 発生した例外の詳細を表示する
        print("Error:", e)
    print("-" * 25)

実行結果

Enter a number:  10
Reciprocal: 0.1
-------------------------
Enter a number:  0
Error: float division by zero
-------------------------
Enter a number:  abc
Error: could not convert string to float: 'abc'
-------------------------

解説

  • この例では、except Exception as eにより、発生した例外オブジェクトが変数eに格納されます。
  • そのため、エラーメッセージがより詳細に表示され、何が問題なのかを把握しやすくなります。

まとめ

 try文とexcept節を用いると、エラーが発生した際にもプログラムの本来の流れを維持しながら、柔軟に対処することができます。

  • 単一のexcept節では、特定の例外に対してのみ処理を記述できます。
  • 複数の例外をタプルで指定することで、一括してエラー処理を行うことが可能です。
  • さらに、例外オブジェクトを取得することで、エラーの詳細を把握し、より適切な対応が可能となります。

 これらの技法を活用することで、堅牢でユーザーフレンドリーなプログラムを作成できるようになります。