例外処理
例外とは
プログラム実行中に発生するエラーのことです。例外処理を書かないとプログラムが異常終了します。
# 例外が発生する例
# print(10 / 0) # ZeroDivisionError
# int("abc") # ValueError
# my_list = [1, 2, 3]
# print(my_list[10]) # IndexError
try-except文
try:
num = int(input("数値を入力: "))
result = 100 / num
print(f"結果: {result}")
except ValueError:
print("数値を入力してください")
except ZeroDivisionError:
print("0で割ることはできません")
複数の例外をまとめてキャッチ
try:
result = some_function()
except (ValueError, TypeError, KeyError) as e:
print(f"エラーが発生しました: {e}")
else と finally
try:
f = open("data.txt", "r")
content = f.read()
except FileNotFoundError:
print("ファイルが見つかりません")
else:
# 例外が発生しなかった場合に実行
print(f"読み込み成功: {len(content)}文字")
finally:
# 例外の有無に関わらず必ず実行
print("処理完了")
主要な組み込み例外
| 例外 | 説明 |
|---|---|
ValueError |
不正な値 |
TypeError |
不正な型 |
KeyError |
辞書のキーが存在しない |
IndexError |
リストのインデックスが範囲外 |
FileNotFoundError |
ファイルが見つからない |
ZeroDivisionError |
0で割った |
AttributeError |
存在しない属性 |
ImportError |
インポートに失敗 |
NameError |
定義されていない変数 |
raise文(例外を発生させる)
def set_age(age):
if not isinstance(age, int):
raise TypeError("年齢は整数で指定してください")
if age < 0 or age > 150:
raise ValueError("年齢は0から150の間で指定してください")
return age
try:
set_age(-5)
except ValueError as e:
print(e) # 年齢は0から150の間で指定してください
カスタム例外
class InsufficientFundsError(Exception):
def __init__(self, balance, amount):
self.balance = balance
self.amount = amount
super().__init__(
f"残高不足: 残高{balance}円に対して{amount}円の引き出し"
)
class BankAccount:
def __init__(self, balance=0):
self.balance = balance
def withdraw(self, amount):
if amount > self.balance:
raise InsufficientFundsError(self.balance, amount)
self.balance -= amount
return self.balance
account = BankAccount(1000)
try:
account.withdraw(1500)
except InsufficientFundsError as e:
print(e) # 残高不足: 残高1000円に対して1500円の引き出し
まとめ
try/exceptで例外をキャッチして安全に処理- 特定の例外クラスを指定してキャッチする
elseは例外なしの場合、finallyは必ず実行raiseで例外を発生させる- カスタム例外は
Exceptionを継承して作る