はじめに
本記事では Python の例外処理についてまとめています。
例外処理は、プログラムの実行中に予期せぬエラーが発生した場合に、プログラムを正常に終了させたり、適切な処理を行うための仕組みです。これにより、プログラムの安定性と信頼性を高めることができます。
例外の種類
Pythonでは、様々な種類の例外が定義されています。
-
ZeroDivisionError
: ゼロで除算しようとした場合に発生 -
NameError
: 未定義の変数や関数を参照しようとした場合に発生 -
TypeError
: オブジェクトの型が間違っている場合に発生 -
KeyError
: 辞書型でキーが存在しない場合に発生 -
FileNotFoundError
: ファイルが存在しない場合に発生
例外処理の基礎
Pythonでは、try-except
ブロックを用いて例外処理を行います。
try:
# エラーが発生する可能性のあるコード
x = 10 / 0
except ZeroDivisionError:
# ZeroDivisionError 発生時の処理
x = 0
-
try
ブロック
エラーが発生する可能性のあるコードを記述。 -
except
ブロック
特定のエラーが発生した場合に実行されるコードを記述。
finally ブロック
必ず実行したい処理がある場合は、finally
ブロックを使用します。
try:
f = open("my_file.txt", "r")
data = f.read()
# データの処理
except FileNotFoundError:
print("ファイルが見つかりません")
finally:
f.close()
print("ファイルを閉じました")
else ブロック
try
ブロック内のコードが例外なしに正常に実行された場合にのみ実行されるブロックです。
try:
# 例外が発生する可能性のあるコード
result = 10 / 2
except ZeroDivisionError:
print("ゼロで除算することはできません")
else:
print("計算結果は:", result)
複数の例外処理
複数の例外に対応するためには、複数の except
句を使います。
try:
x = 10 / 0
except ZeroDivisionError:
x = 0
except TypeError:
x = 10
入れ子状の try-except ブロック
入れ子構造により、それぞれのレベルで別々の例外を処理できます。
import requests
def get_webpage_data(url):
try:
response = requests.get(url)
response.raise_for_status() # ステータスコードが異常な場合に例外を発生させる
try:
# 取得したHTMLを解析する処理
# ...
except ValueError:
print("HTMLの解析中にエラーが発生しました")
except requests.exceptions.RequestException as e:
print(f"リクエスト中にエラーが発生しました: {e}")
例外の再投げ
例外を抜け消すのではなく、最上レベルに再投げする場合に使用します。
try:
try:
result = 1 / 0
except ZeroDivisionError as e:
print("内部で例外を処理")
raise # 再投げ
except Exception as e:
print(f"グローバルな例外処理: {e}")
エラー情報を収集する方法
例外発生時に詳細なエラー情報を取得するには、以下の方法を使用できます。
except
句で変数を使用
try:
result = 1 / 0
except Exception as e:
print(f"エラータイプ: {type(e).__name__}, 詳細: {e}")
sys.exc_info()
を使用
import sys
try:
result = 1 / 0
except:
exc_type, exc_obj, exc_traceback = sys.exc_info()
print(f"エラータイプ: {exc_type.__name__}, 詳細: {exc_obj}")
traceback モジュールを使用
import traceback
try:
result = 1 / 0
except Exception as e:
print("\n".join(traceback.format_exception(None, e, e.__traceback__)))