Python は try/except ブロックと、任意の else および finally を使ってエラーを処理します。Python は EAFP 原則("Easier to Ask Forgiveness than Permission" — 許可を求めるより許しを請う方が簡単)を取り入れており、先に条件をチェックするのではなく、まず操作を試みて例外を処理することを好みます。
Python は try/except ブロックと、任意の else および finally を使ってエラーを処理します。Python は EAFP 原則("Easier to Ask Forgiveness than Permission" — 許可を求めるより許しを請う方が簡単)を取り入れており、先に条件をチェックするのではなく、まず操作を試みて例外を処理することを好みます。
try:
result = risky_operation()
except ValueError as e: # catch a SPECIFIC exception type
print(f"bad value: {e}")
except (KeyError, IndexError): # catch multiple types
print("lookup failed")
except Exception as e: # catch-all (use sparingly, last)
print(f"unexpected: {e}")
else:
print("ran only if NO exception occurred")
finally:
cleanup() # ALWAYS runs (success or failure)
except SpecificError — 特定の型を捕捉する(裸の catch-all より望ましい)。else — 例外が発生しなかった場合にのみ実行される。finally — 例外が伝播する場合でも、常に実行される(後始末、リソースの解放)。# LBYL ("Look Before You Leap") — check first
if key in my_dict:
value = my_dict[key]
# EAFP ("Easier to Ask Forgiveness") — try it, handle failure — more Pythonic
try:
value = my_dict[key]
except KeyError:
value = default
Python は慣習的に EAFP を好みます。操作を試みて例外を捕捉するこの方式は、競合状態を回避でき、事前チェックよりもしばしばすっきりします。
if amount < 0:
raise ValueError("amount must be positive") # raise a built-in
class InsufficientFundsError(Exception): # custom exception type
pass
raise InsufficientFundsError("balance too low")
# ❌ bare except hides bugs (catches EVERYTHING, even typos/KeyboardInterrupt)
try: ...
except: pass
# ✅ catch specific exceptions; re-raise what you can't handle
try: ...
except ValueError as e:
logger.error(e)
raise # re-raise to propagate
✓ Catch SPECIFIC exceptions, not bare except
✓ Don't silently swallow errors (except: pass) — log or handle them
✓ Use finally / context managers (with) for cleanup
✓ Raise meaningful, specific exception types
堅牢なエラー処理は信頼性の高いプログラムに不可欠であり、Python のアプローチには知っておくべき独特のイディオムがあります。try/except/else/finally の構造、EAFP の哲学(事前チェックではなく試して処理する方が Python 的で、競合状態を回避できる)、特定の例外を捕捉すること(バグを隠してしまう裸の except を避ける)、そして後始末のための finally/context manager の利用です。
これらを理解しておくことで、未処理エラーによるクラッシュと、過度に広範あるいは黙殺型の例外処理が引き起こす、見つけにくく厄介な問題の両方を防げます。後者は信頼性の低いコードの頻繁な原因です。