【第22回Python基礎講座】転ばぬ先の杖!例外処理(try-except)

本ページはプロモーションが含まれています
【第22回Python基礎講座】転ばぬ先の杖!例外処理(try-except)
国内のAI狂い

やっほー!国内のAI狂いだよ!✨

第22回へようこそ!今回は、プログラムの安全装置「例外処理(Error & Exception)」について学ぶよ。
人間だってミスをするし、機械だって故障するよね。
大事なのは「絶対にミスしないこと」じゃなくて、「ミスが起きた時にどうカバーするか(リカバリー)」なんだ。
Pythonには、エラーを優しくキャッチしてくれる try-except という機能があるから、これを使いこなして「落ちないプログラム」を作ろう!🛡️🦸‍♀️

公式の「ここがわかりにくい」:構文エラーと例外の違い

公式ドキュメントでは、エラーを2種類に分けて説明しているよ。

エラーには (少なくとも) 二つのはっきり異なる種類があります。それは 構文エラー (syntax error)例外 (exception) です。

これ、要するにこういうこと!👇

  • 構文エラー(Syntax Error): 「文法ミス」。プログラムを実行する前に「書き方間違ってるよ!」って怒られるやつ。そもそも動かない。
    (例:if の後のコロン : 忘れ、カッコの閉じ忘れ)
  • 例外(Exception): 「実行時エラー」。文法は合ってるけど、動かしてみたら起きる事故。
    (例:割り算で0で割っちゃった、存在しないファイルを開こうとした)

今回学ぶ「例外処理」でキャッチできるのは、後者の「例外」の方だけだよ!(文法ミスは直さないと動かないからね!)

1. try-except:エラーを捕まえる網

要するにこれは「失敗するかもしれない処理を監視して、失敗したら助ける機能」だよ!

使い方はシンプル。
「エラーが起きそうなコード」を try ブロックに入れて、「エラーが起きた時の処理」を except ブロックに書くんだ。

🐍 サンプルコードを見る(クリックで開閉)
# 0で割るという危険な行為に挑戦!

try:
    num = 10
    div = 0
    result = num / div
    print(f"結果は {result} です")
except ZeroDivisionError:
    print("【エラー】0で割ることはできません!")

print("プログラムは無事に終了しました")
💻 実行結果:
【エラー】0で割ることはできません!
プログラムは無事に終了しました

もし try-except がなかったら、真っ赤なエラーメッセージが出てプログラムがそこで強制終了しちゃうところだったね。
except のおかげで、メッセージを表示して次の処理(最後のprint)に進めたよ!✨

2. 複数の罠に対応する

エラーの種類(例外クラス)はたくさんあるよ。
ValueError(値がおかしい)、TypeError(型がおかしい)、IndexError(範囲外)などなど。
それぞれ別々の対処をしたい時は、except を並べて書けるんだ。

🐍 複数対応のサンプル(クリックで開閉)
try:
    # ユーザーに入力させる(数字以外が来るかも?)
    x = int(input("数字を入れてね: "))
    result = 100 / x
    print(f"100を{x}で割ると {result} です")

except ValueError:
    print("エラー:数字じゃない文字が入力されました!")
except ZeroDivisionError:
    print("エラー:0を入力しないでください!")
except Exception as e:
    # その他の予期せぬエラーはここでキャッチ
    # as e でエラーの詳細情報を受け取れる
    print(f"予期せぬエラーが発生しました: {e}")
【重要】 Exception はほとんどの例外の親玉。
具体的なエラー(ZeroDivisionErrorなど)を先に書いて、最後に Exception で「その他全部」を拾うのが鉄則だよ!

3. 【試験頻出】else と finally の役割

try には elsefinally もくっつけられるよ。
ここ、ループの else と同じくらい試験に出るから要チェック!

  • else:エラーが起きなかった時だけ実行される(tryの成功祝い🎉)。
  • finally:エラーが起きても起きなくても、絶対に最後に実行される(後片付け🧹)。
🐍 全部入りコード(クリックで開閉)
def divide_check(a, b):
    try:
        result = a / b
    except ZeroDivisionError:
        print("× エラー:0除算")
    else:
        print(f"○ 成功:答えは {result}")
    finally:
        print("--- 処理終了(必ず実行) ---")

print("【1回目:成功パターン】")
divide_check(10, 2)

print("\n【2回目:失敗パターン】")
divide_check(10, 0)
💻 実行結果:
【1回目:成功パターン】
○ 成功:答えは 5.0
— 処理終了(必ず実行) —

【2回目:失敗パターン】
× エラー:0除算
— 処理終了(必ず実行) —

finally は、ファイルを開いた後に閉じたり、データベース接続を切断したりする「後始末」によく使われるよ。

4. raise:わざとエラーを起こす!

要するにこれは「異常事態だから処理を中断して!」って叫ぶ機能だよ!

自分からエラーを発生させたい時は raise を使うよ。
例えば「年齢がマイナスなんてありえない!」って時に、自分でエラーを作って投げることができるんだ。

age = -5
if age < 0:
    raise ValueError("年齢は0以上じゃないとダメだよ!")

試験に出る!要注意ポイント

今回の範囲で、Python 3 エンジニア認定基礎試験によく出るポイントをまとめたよ!📝

① 例外の階層構造(継承)

例外はクラスとして定義されていて、親子関係があるよ。
親クラス(例:Exception)で except すると、その子クラス(例:ValueError)も全部キャッチしちゃう。
だから、「狭い範囲(子)」を先に、「広い範囲(親)」を後に書かないと、特定のエラー処理が動かなくなっちゃうんだ。

② 構文エラーはキャッチできない

try ブロックの中に print("hello" (カッコ閉じ忘れ)みたいな構文エラー(SyntaxError)があっても、それは実行前にPythonが見つけて止めるから、except SyntaxError: で捕まえることはできないよ(プログラム自体が始まらない)。

💡 管理人の失敗エピソード
「とりあえず全部のエラーを無視したい!」と思って except: pass (裸のexcept)を書いたことがあるの。
そしたら、プログラムを停止させる Ctrl+C (KeyboardInterrupt)まで無視されちゃって、無限ループが止まらなくなってPCごと再起動したよ😱
エラーを握りつぶすのは危険!どうしてもやるなら except Exception: にしようね(これならシステム終了系はすり抜けるから)。

理解度チェック!ミニクイズ

例外処理の仕組み、理解できたかな?
試験レベルの問題でチェックしてみよう!🔍

次のうち、try-except で捕捉できないエラーはどれ?
  1. ZeroDivisionError(0除算)
  2. SyntaxError(構文ミス)
  3. IndexError(リスト範囲外)
▼ クリックで正解を表示
正解: 2. SyntaxError

解説:
構文エラーはプログラムの実行前(パース段階)に検出されるから、try ブロックで囲んでも捕捉できないよ。

try 文の else 節が実行されるのはどんな時?
  1. 例外が発生した時
  2. 例外が発生しなかった時
  3. 常に実行される
▼ クリックで正解を表示
正解: 2. 例外が発生しなかった時

解説:
else は「成功ルート」。例外が発生せず、try ブロックを無事に完走した時だけ実行されるよ。
常に実行されるのは finally だね。

意図的に例外を発生させるキーワードは?
  1. throw
  2. error
  3. raise
▼ クリックで正解を表示
正解: 3. raise

解説:
JavaやC++などは throw だから間違えやすいけど、Pythonでは raise(持ち上げる、発生させる)を使うよ。

まとめ:次回への引き

今回は「例外処理」について解説したよ!
エラーを恐れず、適切に対処できるようになれば、安心してプログラムを動かせるね✨

次回は、いよいよPythonのラスボス級概念、「クラス(Class)とオブジェクト指向」に突入するよ!
「オブジェクト指向って何?」って人も大丈夫。
「たい焼きの型」と「たい焼き」の関係で分かりやすく説明するから、リラックスして待っててね!👋✨

出典: Python公式チュートリアル
Copyright © 2001-2026 Python Software Foundation. Licensed under the PSF License.

よかったらシェアしてね!
  • URLをコピーしました!
目次