例外処理: エラーへの対処

try/except でエラーをキャッチ。具体的な例外を狙う。

try
例外が発生しうるコードを囲む。
except
例外をキャッチして処理。
raise
例外を発生させる。

例外処理基礎

サーカスの安全ネット (Safety Net)

例外処理(try-except)は「サーカスの安全ネット」です。プログラム(空中ブランコ)を実行中に、予期せぬエラー(落下)が起きても、ネットがあれば地面に激突して終了(クラッシュ)するのを防げます。ネットの上で体勢を立て直し、演技(処理)を続けることができます。

エラーが起きそうな場所を `try` ブロックで囲み、起きたときのアクションを `except` ブロックに書きます。これにより、1つのエラーでアプリ全体が停止するのを防ぎ、ユーザーに適切なメッセージを表示したり、ログを記録したりできます。

try/except/else/finally
try:
result = 10 / 0
except ZeroDivisionError as e:
print(f"エラー: {e}")
else:
print("成功!")
finally:
print("必ず実行")
# 例外を発生させる
def validate_age(age):
if age < 0:
raise ValueError("Age must be positive")
return age
Bad
# ❌ Bad: 全ての例外をキャッチ
try:
result = do_something()
except Exception: # バグを隠す
pass
Good
# ✅ Good: 具体的な例外をキャッチ
try:
result = do_something()
except ValueError as e:
logger.error(f"Invalid value: {e}")
except IOError as e:
logger.error(f"IO error: {e}")

カスタム例外

Custom Exception Class
# カスタム例外
class ValidationError(Exception):
def __init__(self, field: str, message: str):
self.field = field
self.message = message
super().__init__(f"{field}: {message}")
# 使用
def validate_email(email: str):
if "@" not in email:
raise ValidationError("email", "Invalid format")
try:
validate_email("invalid")
except ValidationError as e:
print(f"Field: {e.field}, Message: {e.message}")
Tip: Exception を継承してドメイン固有の例外を作る。

合格ライン

try/except を使える
カスタム例外を定義できる

演習課題

課題1: try/except
try/except で例外を捕捉してください。
課題2: カスタム例外
Exception を継承してカスタム例外を作成してください。