プログラミング初心者がよく困るのが「ネストが深くなりすぎて、途中で処理を止めたいのに止められない」問題です。
実務では 例外(try/except) を「非常口」として使い、複雑なネストを一気に抜けるテクニックがよく使われます。
1. 例外は「非常口」
- 通常の流れ:
forやifの中を順番に処理する。 - 例外の流れ: 「もう続けられない!」となったら 例外を投げる(raise) → 一気に外側へジャンプ。
- イメージ図:
処理の流れ ──▶▶▶▶▶
↑
│ raise Exception()
└── 非常口から脱出 → except 節へ
2. 例題:二重ループから一気に脱出
フラグ方式だとこうなる
found = False
for row in matrix:
for num in row:
if num == target:
print("見つかった:", num)
found = True
break
if found:
break
Python👉 フラグを使って「外側も抜ける」工夫が必要。
例外方式だともっとシンプル
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
target = 5
try:
for row in matrix:
for num in row:
if num == target:
print("見つかった:", num)
raise StopIteration # ← 非常口で一気に脱出
except StopIteration:
pass
Python👉 raise StopIteration で「もう探す必要なし!」と宣言 → except に飛んで処理終了。
フラグ不要でスッキリ。
3. 例題:エラー検出と即時終了
lines = [
"INFO: 起動",
"INFO: 接続",
"ERROR: タイムアウト",
"INFO: 再試行"
]
try:
for i, line in enumerate(lines, start=1):
if line.startswith("ERROR"):
print(f"最初のエラーは {i} 行目: {line}")
raise RuntimeError("エラー検出") # ← 即脱出
except RuntimeError:
print("エラー処理を実行しました")
Python👉 ネストが深くても「エラーを見つけたら即脱出」できる。
4. 例題:関数化+例外でさらに整理
def search_matrix(matrix, target):
try:
for row in matrix:
for num in row:
if num == target:
return f"見つかった: {num}"
raise ValueError("見つからなかった")
except ValueError as e:
return str(e)
print(search_matrix([[1,2],[3,4]], 3)) # 見つかった: 3
print(search_matrix([[1,2],[3,4]], 5)) # 見つからなかった
Python👉 「見つからなかった」ケースを例外で表現すると、処理の意図が明快になる。
5. 初心者向けまとめ
- 例外は「非常口」 → ネストを一気に抜けられる。
- フラグ方式よりシンプル → 状態変数を持たなくても良い。
- 関数化と組み合わせるとさらに読みやすい。
- 実務では「エラー検出」「探索打ち切り」「複雑な条件分岐の脱出」によく使われる。
👉 次のステップとして「例外を使いすぎるとコードが読みにくくなる」問題もあります。そこで 「通常の制御(break/return)」と「本当に異常なケース(例外)」を使い分けるのがプロのテクニックです。


