Python プログラミングを始めたばかりのころ、「プログラムがエラーで突然止まっちゃった!」という経験はありませんか?
エラーは避けられないものですが、Pythonにはエラーが起きてもプログラム全体が止まらないように、うまく対処するための仕組み try...except
があります。
この記事では、try...except
の基本から、さらに一歩進んだ使い方まで、初心者の方にも分かりやすく解説します。
前回、WEBスクレイピングの記事を書いたのですが、try...except
については断片的すぎたかなと思い記事を書くことにしました。
ご参照いただけましたら幸いです。
目次
なんでエラーが起きるの?
(例:ゼロ除算と型変換エラー)
例1:ゼロでの割り算 (ZeroDivisionError)
result = 10 / 0
例2:文字を数字にしようとする (ValueError)
number = int("こんにちは")

基本的なエラー対策: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 の後...")

どんな時に使う?実用的な例
try...except
は、以下のような、いつエラーが起きるか予測しにくい場面で特に役立ちます。
- ファイル操作
- ファイルを開こうとしたら、そのファイルが存在しなかった (
FileNotFoundError
)。ファイルに書き込もうとしたら、ディスク容量が足りなかった (OSError
など)。
- ファイルを開こうとしたら、そのファイルが存在しなかった (
- ネットワーク通信
- Webサイトにアクセスしようとしたら、インターネットに接続されていなかったり、相手のサーバーが応答しなかったりした (
requests.exceptions.RequestException
など)。 (先のスクレイピング例でも使いましたね!)
- Webサイトにアクセスしようとしたら、インターネットに接続されていなかったり、相手のサーバーが応答しなかったりした (
- ユーザーからの入力
- ユーザーに年齢(数値)を入力してもらったつもりが、文字を入力された (
ValueError
)。
- ユーザーに年齢(数値)を入力してもらったつもりが、文字を入力された (
上手な使い方 (ベストプラクティス)
try...except
を効果的に使うためのコツがいくつかあります。
- 【try ブロックは最小限に】
- 【except は具体的に】
エラーが発生する可能性のあるコードだけを try の中に入れましょう。関係ないコードまで入れると、どこでエラーが起きたのか分かりにくくなります。
except: だけ(裸の except とも呼ばれます)だと、どんなエラーでもキャッチしてしまい、予期せぬ問題(例えばプログラムのバグ)まで隠してしまうことがあります。できるだけ except ValueError: や except FileNotFoundError: のように、想定される具体的なエラーを指定するのが良い書き方です。最後の砦として、想定外のエラーをキャッチするために except Exception as e: を使うのは有効です。
さらに先へ (発展的なトピック紹介)
try...except
には、さらに高度な使い方もあります(ここでは紹介だけに留めます)。
- 独自例外クラス: プログラム固有のエラー状況(例:「ユーザーアカウント残高不足エラー」など)を表現するために、自分でオリジナルのエラーの種類を作ることができます。
- 例外の連鎖 (
raise from
): エラーをキャッチした後、より詳しい情報(どこで、なぜ起きたか)を付け加えて、別のエラーとして再度発生させることができます。エラーの原因を追いやすくするのに役立ちます。
これらは、より複雑なプログラムを書く際に役立つテクニックです。興味があれば調べてみてください。
まとめ
try...except
そして finally
は、Python でエラーに強く、安定して動作するプログラム(堅牢なコードと言います)を書くための必須ツールです。
try
: エラーが起きるかもしれない処理を試す。except
: エラーが起きたときの対処をする (as e
で詳細取得も)。finally
: エラーの有無に関わらず、最後に必ず実行する後始末をする。
最初は難しく感じるかもしれませんが、ファイル操作やユーザー入力処理など、エラーが起こりやすい場面で意識して使ってみることで、その便利さと重要性が分かってくるはずです。エラー処理は、良いプログラムを作る上で欠かせない要素です!
ゼロで割り算をしても、「ZERO」と言う結果しか得られないですよね。
また、文字列である値を数値に格納することはできません。