Python例外処理マスター:try、except、else、finallyを徹底解説
Python例外処理マスター:try、except、else、finallyを徹底解説
このガイドでは、実用的なコードスニペットとベストプラクティスでPythonの例外処理構造を解説します。
動画:Python例外処理(try..except..finally)
Pythonの例外
Pythonは実行時エラーが発生すると組み込み例外を発生させます。インタプリタは現在のコードブロックを停止し、ハンドラが見つかるまでコールスタックを上に例外を伝播させます。ハンドラが存在しない場合、プログラムは終了しトレースバックを出力します。
以下の呼び出しチェーンを考えます:AがBを呼び、BがCを呼ぶ。Cがローカルで処理されない例外を発生させると、例外はB、次にAへとバブルアップします。未処理例外はプログラムの急激なクラッシュを招きます。
Pythonでの例外キャッチ
例外を捕捉するには、潜在的に危険なコードをtryブロック内に配置します。except節に例外発生時のロジックを記述します。
フローを示す簡潔な例:
# 例外タイプ検査用にsysモジュールをインポート
import sys
random_list = ['a', 0, 2]
for entry in random_list:
try:
print("The entry is", entry)
r = 1 / int(entry)
break
except:
print("Oops!", sys.exc_info()[0], "occurred.")
print("Next entry.")
print()
print("The reciprocal of", entry, "is", r)
出力
The entry is a Oops! <class 'ValueError'> occurred. Next entry. The entry is 0 Oops! <class 'ZeroDivisionError'> occurred. Next entry. The entry is 2 The reciprocal of 2 is 0.5
コードはrandom_listをイテレーションします。int変換や除算が失敗するとexceptブロックがエラーを処理、ログ出力し、次のアイテムへ移動。成功時はループを抜け逆数を出力します。
すべての組み込み例外はExceptionを継承しているため、汎用的にキャッチ可能:
# 例外タイプ検査用にsysモジュールをインポート
import sys
random_list = ['a', 0, 2]
for entry in random_list:
try:
print("The entry is", entry)
r = 1 / int(entry)
break
except Exception as e:
print("Oops!", e.__class__, "occurred.")
print("Next entry.")
print()
print("The reciprocal of", entry, "is", r)
出力は同一ですが、ハンドラがe.__class__で特定の例外クラスを参照するようになります。
特定例外のキャッチ
すべての例外を広く捕捉するとバグを隠蔽しデバッグを困難にします。代わりに、想定される例外タイプのみを列挙してください。
tryブロックには複数のexcept節を含められます;最初に一致した節のみ実行されます。例:
try:
# エラーを発生させる可能性のあるコード
pass
except ValueError:
# ValueErrorを処理
pass
except (TypeError, ZeroDivisionError):
# TypeErrorまたはZeroDivisionErrorを処理
pass
except Exception:
# その他の例外のフォールバック
pass
Pythonでの例外発生
自動例外に加え、開発者はraise文で明示的にエラーを発生させられます。オプションでメッセージを渡して理由を明確化できます。
raise KeyboardInterrupt
# Traceback: KeyboardInterrupt
raise MemoryError("This is an argument")
# Traceback: MemoryError: This is an argument
try:
a = int(input("Enter a positive integer: "))
if a <= 0:
raise ValueError("That is not a positive number!")
except ValueError as ve:
print(ve)
Python tryのelse節
オプションのelse節は、tryブロックが例外を発生させずに完了した場合のみ実行されます。このパターンで成功パスのコードをエラー処理から分離できます。
例:偶数の逆数を出力。
# 偶数の逆数を出力するプログラム
try:
num = int(input("Enter a number: "))
assert num % 2 == 0
except:
print("Not an even number!")
else:
reciprocal = 1 / num
print(reciprocal)
奇数入力時の出力:
Enter a number: 1 Not an even number!
偶数入力時の出力:
Enter a number: 4 0.25
numがゼロの場合、ZeroDivisionErrorはelseブロックで発生し、先行するexcept節では捕捉されないことに注意。
Python try…finally
finally節は例外発生の有無に関わらずクリーンアップコードの実行を保証します。ファイル、ネットワーク接続、GUIなど外部リソース操作時に不可欠です。
ファイル処理での典型的な使用:
try:
f = open("test.txt", encoding='utf-8')
# ファイル操作を実行
finally:
f.close()
処理中にエラーが発生してもファイルは常にクローズされます。
Python
- Raspberry PiとPythonでリモート温度センサーを構築 – ステップバイステップガイド
- C++例外処理をマスター:try、catch、throwの実践例
- Python キーワードと識別子: 予約語と命名規則をマスター
- Python 文・インデント・コメント: 明確なガイド
- Python 変数・定数・リテラル: 包括的ガイド
- Python 型変換とキャスト: 包括的ガイド
- Python I/Oとモジュールインポート完全マスター: 実践ガイド
- Python pass文完全マスター: 実践ガイド
- Python グローバル・ローカル・非ローカル変数を理解する
- Pythonディレクトリ・ファイル操作マスター:作成、移動、一覧、リネーム、削除
- Python例外処理マスター:try、except、else、finallyを徹底解説