この記事で最初に覚えることは、例外処理は「エラーを消す仕組み」ではなく「止まりそうな処理を安全に受け止める仕組み」だという点です。 何でも例外処理で包めばよいわけではなく、事前に防げる失敗と、起きてからしかわからない失敗を分けて考えるのが基本です。
まず、どんな場面で困るのか
たとえばWebフォームで年齢欄にabcが入ったり、ファイルが見つからなかったり、0で割ろうとしたりすると、処理は途中で止まります。画面が真っ白になったり、次の処理に進めなかったりすると、利用者にも開発者にも困りごとが残ります。
| 場面 | 起きやすい失敗 | 例外処理の役目 |
|---|---|---|
| 入力フォーム | 数字のはずなのに文字が入る | 再入力をうながす |
| ファイル読み込み | 指定したファイルがない | 別の案内を返す |
| 計算処理 | 0で割ってしまう | 処理停止を防ぐ |
| 外部通信 | 相手先が一時的に応答しない | 後で再試行しやすくする |
つまり例外処理は、失敗を「なかったこと」にするのではなく、失敗したときの逃げ道を用意する考え方です。
動きの流れを先に押さえる
例外処理の基本の流れは、次の4段階です。
- 失敗するかもしれない処理を
tryに置く - 起きたエラーの種類ごとに
exceptで受ける - エラーがなかったときだけ進めたい処理を
elseに置く - 成功・失敗に関係なく最後にやる後片付けを
finallyに置く
この並びを覚えておくと、コードを読んだときに「どこで失敗を拾っているのか」が見つけやすくなります。
例外処理なしとありの差
| 例外処理なし | 例外処理あり |
|---|---|
| エラーが出た瞬間に止まる | エラーを受け止めて続行しやすい |
| 後ろの処理が実行されない | 再入力や代替処理に進める |
| 原因を見落としやすい | 種類ごとに分けて対応できる |
| 利用者には失敗だけが見える | わかりやすい案内を返せる |
大事なのは、例外処理は「何が起きても成功にする魔法」ではないことです。失敗を受け止めたあとに、何を表示するか、どこへ進むかを決めるための仕組みだと考えると理解しやすくなります。
Pythonで見る、止まる前と止まらない後
以下はPython 3だけで動く例です。外部ライブラリは使いません。
まず、例外処理がない場合です。数字の代わりに文字が入ると、そこで止まります。
text = input('整数を入力してください: ')
n = int(text)
result = 100 / n
print(result)
print('ここまで進むはずでした')
次に、例外処理を入れた場合です。数字の変換に失敗したら入力し直し、0なら割り算をやり直します。
while True:
try:
text = input('整数を入力してください: ')
n = int(text)
result = 100 / n
except ValueError:
print('数字を入力してください。')
continue
except ZeroDivisionError:
print('0では割れません。')
continue
else:
print(f'100 / {n} = {result}')
break
print('ここまで進みます。')
この例では、ValueErrorとZeroDivisionErrorを別々に受けています。似た名前のエラーでも意味が違うので、分けて書くと原因が追いやすくなります。多くの言語では、例外はクラスとして用意されていて、必要に応じて標準のライブラリから使います。
書くときに気をつけたいこと
例外処理でやりがちな失敗は、主に3つあります。
- 広すぎる範囲をまとめて受けること。原因がぼやけて、別の不具合まで隠れやすくなります。
- 何でも
except Exceptionで包んで、空のまま終わらせること。失敗した事実が見えなくなります。 - 本来は入力チェックで防げる失敗まで、あとから例外で受けること。例外処理は最後の安全網です。
たとえばフォームの必須項目が空なら、先に入力チェックで弾くほうが自然です。いっぽう、ファイルが見つからない、通信が切れた、保存先がいっぱいになったといった失敗は、事前に完全には防ぎにくいので、例外処理の出番になりやすいです。
実務ではどう使うのか
現場では、例外を捕まえたらそのまま画面に長いメッセージを出すより、利用者向けには短い案内を出し、詳しい原因はログに残すことが多いです。たとえば「保存に失敗しました。時間をおいて再試行してください」と表示しつつ、裏側ではエラー内容を記録します。
ファイル操作では、finallyで後片付けを書くか、Pythonならwith文を使って自動的に閉じるやり方がよく使われます。どちらも「失敗しても終わり方をきれいにする」ための工夫です。
f = None
try:
f = open('sample.txt', 'r', encoding='utf-8')
print(f.read())
except FileNotFoundError:
print('ファイルが見つかりません。')
finally:
if f is not None:
f.close()
このように、例外処理は画面表示だけでなく、ログ、再試行、後片付けまで含めて考えると実務で役立ちます。
よくある誤解
誤解1: 例外処理を入れればエラーは起きない。
実際には、エラーは起きます。例外処理は、そのときの動きを整える仕組みです。
誤解2: 何でも同じexceptで受ければ安全。
実際には、原因ごとに分けたほうが調査しやすくなります。
誤解3: 例外は特別なものなので、初心者は後回しでいい。
実際には、入力、ファイル、通信を触るとすぐ必要になります。早めに慣れておくと読み書きが安定します。
3問で確認してみる
Q1. 例外処理の役目として最も近いものはどれですか?
A. エラーを必ず消す
B. エラーが起きても処理を受け止めて続けやすくする
C. 画面を速くする
D. 変数を自動で増やす
答えを見る
答え:B. エラーが起きても処理を受け止めて続けやすくする。
Q2. Pythonで数値変換の失敗を受け止めたいときに、まず候補になりやすい例外はどれですか?
A. ValueError
B. ZeroDivisionError
C. FileNotFoundError
D. NameError
答えを見る
答え:A. ValueError。
Q3. 次のうち、例外処理の使い方として注意が必要なのはどれですか?
A. 失敗しやすい部分だけを囲む
B. 原因ごとに例外を分ける
C. 何でも同じ例外として空で受ける
D. 後片付けを入れる
答えを見る
答え:C. 何でも同じ例外として空で受ける。
ここまでの要点をひとことで言うと
例外処理は、失敗をゼロにする技術ではありません。止まりそうな場面で、利用者にわかる形へ言い換えたり、別の道へ進めたり、後始末をきちんとしたりするための土台です。まずは「入力」「ファイル」「通信」のどれで使うのかを見分け、次にtryとexceptを小さく書くところから始めると理解が進みます。
次に読むなら、例外がクラスとしてどう扱われるかを押さえられるクラス、そして便利な部品を再利用する考え方がつながるライブラリの順で読むと、コードの見え方が一段わかりやすくなります。

