Pythonの例外チェーン(from句)を使ったエラーハンドリングを初心者向けにやさしく解説
生徒
「Pythonでエラーが出たとき、原因が分からなくて困ることが多いです。表示されるエラーって読みにくい気がして…」
先生
「Pythonのエラー表示は慣れないと難しく感じますね。実は、エラーの“原因と結果のつながり”を分かりやすくする仕組みがあります」
生徒
「原因と結果のつながり、ですか?」
先生
「はい。それが例外チェーンと呼ばれる仕組みで、from句を使うとエラーの流れをはっきり伝えられるんです」
1. Pythonの例外処理とは何か
Pythonの例外処理とは、プログラムの実行中に起こるトラブルを安全に処理するための仕組みです。たとえば、ファイルが存在しない、数字に変換できない文字を扱った、など人間でいう「想定外の出来事」に対応します。例外処理を使わないと、プログラムは途中で止まってしまいますが、正しく使えば処理を続けたり、分かりやすいメッセージを表示できます。
初心者の方は、まず「エラーは悪者ではなく、状況を教えてくれるサイン」と考えると理解しやすくなります。
2. 例外が発生する基本的な流れ
Pythonでは、問題が起きると例外という形で情報が渡されます。これは「どこで」「なぜ」問題が起きたのかを伝えるためのものです。tryとexceptを使うと、その例外を受け取り、適切な対応ができます。
try:
number = int("abc")
except ValueError:
print("数字に変換できませんでした。")
この例では、文字列を数字に変換しようとして失敗しています。ValueErrorという例外を受け取り、日本語で分かりやすく説明しています。
3. 例外チェーンとは何か
例外チェーンとは、ある例外が別の例外を引き起こした場合に、その関係をつなげて記録する仕組みです。現実の例で言うと、「停電が起きた原因は工事、その工事の原因は確認不足」というように、原因が連なっている状態です。
Pythonでは、内部で発生したエラーをそのまま隠してしまうと、本当の原因が分からなくなります。例外チェーンを使えば、「元の原因」と「最終的に起きた問題」を同時に確認できます。
4. from句を使わない場合の問題点
from句を使わずに新しい例外を投げ直すと、元の例外情報が失われやすくなります。初心者がよくやってしまう書き方を見てみましょう。
try:
int("abc")
except ValueError:
raise Exception("変換処理でエラーが発生しました")
このコードでは、新しい例外は出ますが、最初に起きたValueErrorの詳しい情報が分かりにくくなります。エラーの背景が見えないため、デバッグが難しくなります。
5. from句を使った例外チェーンの基本
from句を使うと、「このエラーは、元のこのエラーが原因です」と明示できます。これが例外チェーンの基本的な使い方です。
try:
int("abc")
except ValueError as e:
raise Exception("数値変換に失敗しました") from e
このように書くことで、元のValueErrorと新しいExceptionがつながります。エラー表示を見ると、どこから問題が始まったのかが一目で分かります。
6. 日常生活にたとえたfrom句の考え方
from句は「原因説明メモ」のようなものです。たとえば、先生に遅刻の理由を聞かれたとき、「寝坊しました」だけでなく、「目覚ましが鳴らなかったから寝坊しました」と説明すると状況が伝わりやすくなります。from句は、この「なぜそうなったのか」をプログラムに伝える役割を持っています。
初心者のうちは難しく感じるかもしれませんが、原因を正直に伝える仕組みだと考えると理解しやすくなります。
7. 複数処理の中でfrom句が役立つ場面
実際のプログラムでは、処理が何段階も重なります。ファイルを読み込み、その内容を変換し、さらに計算する、という流れです。その途中で起きたエラーをまとめて扱うとき、from句があると原因を追いやすくなります。
def read_number(text):
try:
return int(text)
except ValueError as e:
raise RuntimeError("数値読み込み処理で失敗しました") from e
read_number("xyz")
この例では、関数の中で起きたエラーを、処理内容が分かる形で外に伝えています。
8. 初心者が例外チェーンを学ぶメリット
例外チェーンを理解すると、エラー表示を怖がらなくなります。どこで何が起きたのかを順番に追えるため、原因探しが楽になります。また、将来プログラムが大きくなったときも、読みやすく、直しやすいコードにつながります。
最初はtryとexceptだけで十分ですが、「原因も一緒に伝える」という意識を持つことで、より丁寧なエラーハンドリングができるようになります。