例外処理とデバッグ
複数のexceptブロック:
else: 例外が発生しなかった場合に実行
class CustomError(Exception):
"""カスタム例外クラス"""
def __init__(self, message, error_code=None):
super().__init__(message)
self.error_code = error_code
class AgeError(Exception):
"""年齢関連のエラー"""
pass
def validate_age(age):
if age < 0:
raise AgeError("年齢は負の値にはできません")
if age > 150:
raise AgeError("年齢が現実的ではありません")
return True
try:
validate_age(-5)
except AgeError as e:
print(f"年齢エラー: {e}")def read_file_safely(filename):
try:
with open(filename, 'r', encoding='utf-8') as file:
content = file.read()
return content
except FileNotFoundError:
print(f"ファイル '{filename}' が見つかりません")
return None
except PermissionError:
print(f"ファイル '{filename}' へのアクセス権限がありません")
return None
except UnicodeDecodeError:
print(f"ファイル '{filename}' の文字エンコーディングが正しくありません")
return None
# 使用例
content = read_file_safely("example.txt")
if content:
print("ファイル読み取り成功")def divide(a, b):
# デバッグ用のアサーション
assert isinstance(a, (int, float)), "aは数値である必要があります"
assert isinstance(b, (int, float)), "bは数値である必要があります"
assert b != 0, "bはゼロであってはいけません"
return a / b
# テスト
try:
result = divide(10, "2") # AssertionError が発生
except AssertionError as e:
print(f"アサーションエラー: {e}")
# 本番環境では assert を無効化できる
# python -O script.pyimport logging
# ログ設定
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
def process_user_data(data):
try:
# データ処理
result = complex_calculation(data)
logging.info("データ処理が正常に完了しました")
return result
except ValueError as e:
logging.error(f"データエラー: {e}")
raise
except Exception as e:
logging.critical(f"予期しないエラー: {e}")
raise
# 使用例
try:
result = process_user_data([1, 2, 3])
except Exception:
logging.error("データ処理に失敗しました")class Calculator:
def __init__(self):
self.history = []
def calculate(self, expression):
try:
# 安全な評価(evalは危険なので制限された環境で)
allowed_chars = set('0123456789+-*/(). ')
if not all(c in allowed_chars for c in expression):
raise ValueError("無効な文字が含まれています")
result = eval(expression)
self.history.append(f"{expression} = {result}")
return result
except ZeroDivisionError:
return "エラー: ゼロ除算"
except ValueError as e:
return f"エラー: {e}"
except SyntaxError:
return "エラー: 無効な式"
# 使用例
calc = Calculator()
expressions = ["2+2", "10/0", "2*invalid", "3**2"]
for expr in expressions:
result = calc.calculate(expr)
print(f"{expr} → {result}")import json
class DataManager:
def __init__(self, filename):
self.filename = filename
self.data = self.load_data()
def load_data(self):
try:
with open(self.filename, 'r', encoding='utf-8') as file:
return json.load(file)
except FileNotFoundError:
print("データファイルが見つかりません。新しいファイルを作成します。")
return {}
except json.JSONDecodeError:
print("データファイルが破損しています。バックアップから復元してください。")
return {}
def save_data(self):
try:
with open(self.filename, 'w', encoding='utf-8') as file:
json.dump(self.data, file, ensure_ascii=False, indent=2)
return True
except PermissionError:
print("ファイルへの書き込み権限がありません。")
return False
except Exception as e:
print(f"保存中にエラーが発生しました: {e}")
return False
# 使用例
manager = DataManager("user_data.json")
manager.data["users"] = ["太郎", "花子"]
if manager.save_data():
print("データが正常に保存されました")Exceptionではなく具体的な例外型を使用finallyやwith文でリソースを確実に解放次は モジュール に進みましょう!
リソース: - Python.org - エラー - Real Python - 例外処理 - Python Tutor
Python チュートリアル