Pythonにおけるエラー処理
この記事ではPythonにおけるエラー処理について説明します。
YouTube Video
Pythonにおけるエラー処理
Pythonにおけるエラー処理は、主にtry
、except
、else
、および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}")
- このコードは、
IndexError
とZeroDivisionError
をまとめて捕捉し、同じ処理で例外を扱う例です。
無条件に例外をキャッチする
すべての種類の例外を1つのブロックで処理したい場合、except
の引数を省略します。
1try:
2 # This code might cause some exception
3 result = "10" + 5 # TypeError
4except Exception as e:
5 print("Unexpected error")
- ただし、すべての例外を無条件にキャッチするより、特定の例外を処理した方が、バグの発見やデバッグに役立ちます。可能な限り、
ValueError
やTypeError
のように、予測される例外だけを明示的に処理することで、コードの堅牢性が向上します。
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チャンネルもご覧ください。