Pythonにおけるエラー処理

Pythonにおけるエラー処理

この記事ではPythonにおけるエラー処理について説明します。

YouTube Video

Pythonにおけるエラー処理

Pythonにおけるエラー処理は、主にtryexceptelse、およびfinallyというキーワードを用いて行います。こうした構文を使うことで、プログラムのエラー発生時に適切に対応できるようになります。以下にそれぞれの使い方について説明します。

try ブロック

try ブロック内に、実行したいコードを記述します。このブロックでエラーが発生すると、プログラムの実行は即座にexceptブロックに移ります。

 1try:
 2    # Code that may raise an error (division by zero, for example)
 3    #number = int(input("Enter a number: "))
 4    number = int("abc")
 5    result = 10 / number
 6    print("Result:", result)
 7except ValueError as e:
 8    # Handle invalid input (e.g. non-numeric input)
 9    print("Invalid input. Please enter a whole number.")
10    print(f"Value error: {e}")
11except ZeroDivisionError as e:
12    # Handle division by zero error
13    print("Cannot divide by zero!")
14    print(f"Zero division error: {e}")
  • このコードは、try ブロックでエラーを検出し、ValueError または ZeroDivisionError を捕捉して適切に処理する例です。

except ブロック

except ブロックは、特定の例外(エラー)が発生した時に実行されるコードを記述します。発生した例外の種類に応じて、特定の例外をキャッチすることもできます。

 1try:
 2    #number = int(input("Enter a number: "))
 3    number = 0
 4    result = 10 / number
 5    print("Result:", result)
 6except ZeroDivisionError as e:
 7    print("Cannot divide by zero!")
 8    print(f"Zero division error: {e}")
 9except ValueError as e:
10    print("Input was not a valid integer.")
11    print(f"Value error: {e}")
  • このコードは、try ブロックでエラーが発生した際に、except ブロックで例外の種類ごとに処理を分けて実行する例です。

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

複数の例外クラスが同じハンドリングロジックで済む場合、タプルで指定します。

1try:
2    my_list = [1, 2]
3    result = my_list[3] + 10 / 0
4except (IndexError, ZeroDivisionError) as e:
5    print(f"Exception occurred: {e}")
  • このコードは、IndexErrorZeroDivisionError をまとめて捕捉し、同じ処理で例外を扱う例です。

無条件に例外をキャッチする

すべての種類の例外を1つのブロックで処理したい場合、exceptの引数を省略します。

1try:
2    # This code might cause some exception
3    result = "10" + 5  # TypeError
4except Exception as e:
5    print("Unexpected error")
  • ただし、すべての例外を無条件にキャッチするより、特定の例外を処理した方が、バグの発見やデバッグに役立ちます。可能な限り、ValueErrorTypeError のように、予測される例外だけを明示的に処理することで、コードの堅牢性が向上します。

else ブロック

else ブロックは、try ブロック内でエラーが発生しなかった場合にのみ実行されます。

 1try:
 2    #number = int(input("Enter a number: "))
 3    number = 5
 4    result = 10 / number
 5except ZeroDivisionError as e:
 6    print("Cannot divide by zero!")
 7    print(f"Zero division error: {e}")
 8except ValueError as e:
 9    print("Input was not a valid integer.")
10    print(f"Value error: {e}")
11else:
12    # This block will execute only if no exceptions were raised
13    print("Result:", result)
  • このコードは、try ブロックでエラーが発生しなかった場合にのみ else ブロックが実行される例です。

finally ブロック

finally ブロックは、try ブロックでエラーが発生したかどうかに関わらず、最後に必ず実行されるコードを記述するために使用します。リソースの解放やクリーンアップ処理に便利です。

 1try:
 2    #number = int(input("Enter a number: "))
 3    number = int("abc")
 4    result = 10 / number
 5except ZeroDivisionError as e:
 6    print("Cannot divide by zero!")
 7    print(f"Zero division error: {e}")
 8except ValueError as e:
 9    print("Input was not a valid integer.")
10    print(f"Value error: {e}")
11else:
12    # This block will execute only if no exceptions were raised
13    print("Result:", result)
14finally:
15    # This block will always execute, regardless of whether an exception was raised
16    print("Execution completed.")
  • このコードは、例外の有無にかかわらず finally ブロックが必ず実行されることを示す例です。

raiseキーワード

既存のコードで特定の条件が満たされなかった場合に、raiseキーワードを用いて例外を発生させることも可能です。

1def divide(a, b):
2    if b == 0:
3        raise ValueError("Cannot divide by zero.")
4    return a / b
5
6try:
7    result = divide(10, 0)
8except ValueError as e:
9    print(f"Error: {e}")
  • このコードは、raise キーワードを使って条件が満たされない場合に例外を明示的に発生させる例です。

結論

このようにしてエラーを処理することで、プログラムのクラッシュを防ぎ、ユーザーに適切なメッセージを表示したり、プログラムの後続処理を続行させたりできます。

YouTubeチャンネルでは、Visual Studio Codeを用いて上記の記事を見ながら確認できます。 ぜひYouTubeチャンネルもご覧ください。

YouTube Video