【Python】エラー処理入門:try-except-finallyで頑丈なコードを書こう

Python プログラミングを始めたばかりのころ、「プログラムがエラーで突然止まっちゃった!」という経験はありませんか?

エラーは避けられないものですが、Pythonにはエラーが起きてもプログラム全体が止まらないように、うまく対処するための仕組み try...except があります。

【個人開発】Google Cloud Shellで始めるPythonチュートリアル②:requests/Beautiful Soup でWEBスクレイピング入門

2025年4月15日

この記事では、try...except の基本から、さらに一歩進んだ使い方まで、初心者の方にも分かりやすく解説します。

前回、WEBスクレイピングの記事を書いたのですが、try...except については断片的すぎたかなと思い記事を書くことにしました。

ご参照いただけましたら幸いです。

なんでエラーが起きるの?

(例:ゼロ除算と型変換エラー)

例1:ゼロでの割り算 (ZeroDivisionError)
result = 10 / 0

例2:文字を数字にしようとする (ValueError)
number = int("こんにちは")
禄太
これらのコードはエラーで停止してしまいます。
ゼロで割り算をしても、「ZERO」と言う結果しか得られないですよね。
また、文字列である値を数値に格納することはできません。

基本的なエラー対策:try…except

エラーでプログラムが止まるのを防ぐ基本形が try...except です。

try:
    # 【try(試してみよう)ブロック】 エラーが起こるかもしれない処理
    result = 10 / 0 # ここでエラー発生!
    print(f"計算結果: {result}") # 実行されない
except:
    # 【except(もしもtryしてダメだったら)ブロック】 エラーが起きたら代わりに実行
    print("おっと!計算中に問題が発生しました。")

print("プログラムはクラッシュせずに続けられます!")

try の中でエラーが起きると、すぐに except ブロックにジャンプし、プログラムは停止せずに続行します。

どんなエラーが起きたか、もっと詳しく知りたい!

上記のコードでは、一つ問題があります。

【except(もしもtryしてダメだったら)ブロック】の内容だけだと、何かエラーが起きたことは分かっても、具体的にどんな種類のエラーだったのかが分かりません。

これでは原因調査や適切な対応が難しいですよね。

そこで、except に続けて エラーの種類 as 変数名 (特に Exception as e がよく使われます) と書くことで、発生したエラーの詳細情報をキャッチできます。

禄太
つまり、ログ調査用のログの格納先を作りたいんです!

サンプルコード:エラー情報を取得する (as e)

numerator = 10
denominator = 0

try:
    print("計算を試みます...")
    result = numerator / denominator
    print(f"計算結果: {result}")

except Exception as e: # Exception は多くのエラーの親玉。e という変数名でエラー情報を受け取る
    print(f"エラーが発生しました!")
    print(f"エラーの種類: {type(e)}") # エラーの具体的な種類を表示
    print(f"エラーメッセージ: {e}")    # エラーの詳細メッセージを表示

print("プログラムは終了しました。")

実行結果

このように as e を使うと、ZeroDivisionError という具体的なエラーの種類や division by zero というメッセージが取得でき、原因究明に役立ちます。

実践的な使い方:エラーログの記録

取得したエラー情報 e は、画面に表示するだけでなく、ファイルに書き出してログ(記録) として残すこともできます。こうしておけば、後でプログラムがどんなエラーを起こしたかを確認するのに非常に便利です。

(try…except の except ブロック内で)

 except Exception as e:
     error_message = f"エラー発生: {type(e)} - {e}\n"
     print(error_message) # 画面にも表示
     # ファイルにエラーを追記 (簡単な例)
     with open("error.log", "a") as f: # "a" は追記モード
         f.write(error_message)

【例】コードを書いて実行してみます

エラーログの書き込み用のファイルを作成しましょう。

touch error.log

Pythonファイルを以下のように書き換えます。

numerator = 10
denominator = 0

try:
    print("計算を試みます...")
    result = numerator / denominator
    print(f"計算結果: {result}")

except Exception as e: # Exception は多くのエラーの親玉。e という変数名でエラー情報を受け取る
    error_message = f"エラー発生: {type(e)} - {e}\n"
    print(error_message) # 画面にも表示
    # ファイルにエラーを追記 (簡単な例)
    with open("error.log", "a") as f: # "a" は追記モード
        f.write(error_message)

print("プログラムは終了しました。")

【例】エラーの中身を確認します

エラーがあってもなくても、最後に必ずやりたいこと (finally)

プログラムでは、「ファイルを開いたら、処理が成功しようが失敗しようが、最後に必ずファイルを閉じたい」のように、エラーの発生有無にかかわらず、絶対に実行したい後始末処理が必要になることがあります。

そのために使うのが finally 節です。

try...except の最後に 【finally: 】を追加すると、その中のコードは必ず実行されます

numerator = 10
denominator = 0

try:
    # 【try(試してみよう)ブロック】
    # ... 何らかの処理 ...
    print("try ブロックの処理を実行中...")
    # result = 10 / 0 # ここでエラーを起こしても...
    print("try ブロックの処理が正常に完了!")

except Exception as e:
    # 【except(もしもtryしてダメだったら)ブロック】
    print(f"except ブロック実行: エラー {e} が発生しました。")

finally:
    # 【必ず実行ブロック】
    # エラーがあってもなくても、try が終わった後 or except が終わった後に必ず実行される
    print("finally ブロック実行: 後片付け処理などを行います。")

print("try-except-finally の後...")
もう少し詳しく
[ユースケース例:リソースの解放] ファイルを開いたり、ネットワーク接続をしたりした場合、それらを最後に閉じる(解放する)処理を finally に書くことで、リソースの無駄遣いを防げます。(※ファイル操作では後述の with 文を使うのがより一般的です)

どんな時に使う?実用的な例

try...except は、以下のような、いつエラーが起きるか予測しにくい場面で特に役立ちます。

  1. ファイル操作
    • ファイルを開こうとしたら、そのファイルが存在しなかった (FileNotFoundError)。ファイルに書き込もうとしたら、ディスク容量が足りなかった (OSError など)。
  2. ネットワーク通信
    • Webサイトにアクセスしようとしたら、インターネットに接続されていなかったり、相手のサーバーが応答しなかったりした (requests.exceptions.RequestException など)。 (先のスクレイピング例でも使いましたね!)
  3. ユーザーからの入力
    • ユーザーに年齢(数値)を入力してもらったつもりが、文字を入力された (ValueError)。

上手な使い方 (ベストプラクティス)

try...except を効果的に使うためのコツがいくつかあります。

  1. 【try ブロックは最小限に】
  2.  エラーが発生する可能性のあるコードだけを try の中に入れましょう。関係ないコードまで入れると、どこでエラーが起きたのか分かりにくくなります。

  3. 【except は具体的に】
  4.  except: だけ(裸の except とも呼ばれます)だと、どんなエラーでもキャッチしてしまい、予期せぬ問題(例えばプログラムのバグ)まで隠してしまうことがあります。できるだけ except ValueError: や except FileNotFoundError: のように、想定される具体的なエラーを指定するのが良い書き方です。最後の砦として、想定外のエラーをキャッチするために except Exception as e: を使うのは有効です。

さらに先へ (発展的なトピック紹介)

try...except には、さらに高度な使い方もあります(ここでは紹介だけに留めます)。

  • 独自例外クラス: プログラム固有のエラー状況(例:「ユーザーアカウント残高不足エラー」など)を表現するために、自分でオリジナルのエラーの種類を作ることができます。
  • 例外の連鎖 (raise from): エラーをキャッチした後、より詳しい情報(どこで、なぜ起きたか)を付け加えて、別のエラーとして再度発生させることができます。エラーの原因を追いやすくするのに役立ちます。

これらは、より複雑なプログラムを書く際に役立つテクニックです。興味があれば調べてみてください。

まとめ

try...except そして finally は、Python でエラーに強く、安定して動作するプログラム(堅牢なコードと言います)を書くための必須ツールです。

  • try: エラーが起きるかもしれない処理を試す。
  • except: エラーが起きたときの対処をする (as e で詳細取得も)。
  • finally: エラーの有無に関わらず、最後に必ず実行する後始末をする。

最初は難しく感じるかもしれませんが、ファイル操作やユーザー入力処理など、エラーが起こりやすい場面で意識して使ってみることで、その便利さと重要性が分かってくるはずです。エラー処理は、良いプログラムを作る上で欠かせない要素です!