本記事では、Pythonでの例外処理の書き方を解説します。例外処理はtry文を用いることで記述できます。なので、try文について説明します。
例外処理とは
例外処理とは、プログラムの実行中に発生する可能性のあるエラー(例外)を適切に処理する仕組みです。例外が発生した場合、通常はプログラムが強制終了してしまいますが、例外処理を行うことで、エラーが発生しても処理を続行したり、適切なメッセージを表示したりすることができます。
例外処理を行うことで以下のメリットがあります。
- プログラムの堅牢性が向上する
- ユーザーに対して適切なエラーメッセージを提供できる
- エラーが発生しても、プログラムを安全に続行できる
try文とは
Pythonでは、try文を使って例外処理を実装します。try文は、エラーが発生する可能性のあるコードブロックを指定し、エラーが発生した場合の対処法を定義します。
try文の基本的な構造は以下の通りです。
- try: エラーが発生する可能性のあるコードを記述
- except: エラーが発生した場合に実行するコードを記述
- else: エラーが発生しなかった場合に実行するコード(オプション)
- finally: エラーの有無に関わらず、必ず実行されるコード(オプション)
構文
try:
# エラーが発生する可能性のあるコード
except 例外クラス1:
# 例外クラス1のエラーが発生した場合に実行するコード
except 例外クラス2:
# 例外クラス2のエラーが発生した場合に実行するコード
except:
# どの例外クラスにも一致しないエラーが発生した場合に実行するコード
else:
# エラーが発生しなかった場合に実行するコード
finally:
# エラーの有無に関わらず、必ず実行されるコード
例
基本的なtry-except文の使い方
ゼロ除算を試みた場合に発生するZeroDivisionErrorを捕捉し、エラーメッセージを表示する例です。
try:
result = 10 / 0 # ゼロで割るとエラーが発生する
except ZeroDivisionError:
print("ゼロで割ることはできません")
# 出力: ゼロで割ることはできません
複数の例外を処理する例
ユーザー入力を処理する際に発生する可能性のある複数のエラータイプ(ValueError、ZeroDivisionError)を個別に処理する例です。
try:
num = int(input("数値を入力してください: "))
result = 100 / num
print(f"結果: {result}")
except ValueError:
print("数値を入力してください")
except ZeroDivisionError:
print("ゼロで割ることはできません")
# 入力が"abc"の場合の出力: 数値を入力してください
# 入力が"0"の場合の出力: ゼロで割ることはできません
# 入力が"5"の場合の出力: 結果: 20.0
else節とfinally節を使った例
ファイルの読み込み処理で、成功時の処理(else)とクリーンアップ処理(finally)を示す例です。ファイルが存在しない場合はFileNotFoundErrorをキャッチします。
try:
file = open("sample.txt", "r")
content = file.read()
print(content)
except FileNotFoundError:
print("ファイルが見つかりません")
else:
print("ファイルの読み込みに成功しました")
finally:
print("この処理は必ず実行されます")
try:
file.close()
except:
pass # ファイルが開かれていない場合はスキップ
# ファイルが存在する場合の出力:
# (ファイルの内容)
# ファイルの読み込みに成功しました
# この処理は必ず実行されます
# ファイルが存在しない場合の出力:
# ファイルが見つかりません
# この処理は必ず実行されます
例外情報を取得する例
IndexErrorが発生した場合に、例外オブジェクトから詳細情報を取得して表示する例です。
try:
numbers = [1, 2, 3]
print(numbers[5]) # インデックスが範囲外
except IndexError as e:
print(f"エラーが発生しました: {e}")
# 出力: エラーが発生しました: list index out of range
注意点
エラータイプを明示する
except節に例外クラスを指定せずに使用すると、すべての例外をキャッチしてしまいます。これはバグの発見を困難にするため、可能な限り具体的な例外クラスを指定しましょう。
# 良くない例
try:
# 何らかの処理
result = 10 / 0
except:
print("何らかのエラーが発生しました") # どんなエラーか分からない
# 良い例
try:
result = 10 / 0
except ZeroDivisionError:
print("ゼロで割ることはできません") # エラーの内容が明確
# 出力(両方とも): ゼロで割ることはできません
例外処理の範囲を適切に設定する
try文の範囲が広すぎると、どこでエラーが発生したのか特定しにくくなります。例外が発生する可能性のある部分だけをtryブロックに含めるようにしましょう。
# 良くない例
try:
num1 = int(input("1つ目の数値: "))
num2 = int(input("2つ目の数値: "))
result = num1 / num2
print(f"結果: {result}")
except:
print("エラーが発生しました") # どの処理でエラーが発生したのか分からない
# 良い例
try:
num1 = int(input("1つ目の数値: "))
except ValueError:
print("1つ目の入力は数値である必要があります")
exit()
try:
num2 = int(input("2つ目の数値: "))
except ValueError:
print("2つ目の入力は数値である必要があります")
exit()
try:
result = num1 / num2
except ZeroDivisionError:
print("2つ目の数値はゼロ以外である必要があります")
exit()
print(f"結果: {result}")
# 各処理でのエラーが明確に分かる
リソースの解放にはfinallyを使用する
ファイルの操作やデータベース接続など、リソースを使用する場合は、finally節でリソースを確実に解放するようにしましょう。
file = None
try:
file = open("sample.txt", "r")
content = file.read()
print(content)
except FileNotFoundError:
print("ファイルが見つかりません")
finally:
if file is not None:
file.close()
print("ファイルを閉じました")
# ファイルが存在する場合の出力:
# (ファイルの内容)
# ファイルを閉じました
# ファイルが存在しない場合の出力:
# ファイルが見つかりません
# (file.close()は実行されない)
まとめ
Pythonでの例外処理は、try-except-else-finally文を使用して実装します。
- try: 例外が発生する可能性のあるコードを記述
- except: 例外が発生した場合の処理を記述
- else: 例外が発生しなかった場合の処理(オプション)
- finally: 例外の有無に関わらず実行される処理(オプション)
適切な例外処理を行うことで、プログラムの堅牢性が向上し、ユーザーに対して分かりやすいエラーメッセージを提供できます。また、リソースの適切な解放などを保証することができます。
例外処理を適切に行うことは、実用的なPythonプログラムを書く上で非常に重要なスキルです。状況に応じて適切な例外処理を実装し、安定したアプリケーションを開発しましょう。