Pythonでプログラムを動かしていると、突然画面に赤い文字がバーっと出てきて、プログラムが止まってしまうこと、ありませんか?
実は、この面倒なエラーを「無視せず、上手に乗り越える」方法があります。それが今回ご紹介するtry-except(トライ・エクセプト)という機能です。これを使えば、プログラムがエラーで途中で止まらずに、スマートに処理を続けられるようになります。初心者の方でもコピペで簡単に実装できるので、一緒にエラーを味方につけて、もっと快適なプログラミングライフを手に入れましょう!
try-exceptって何? エラーと「良い関係」を築く方法
まず「エラー」と聞くと、「バグ(プログラムの欠陥)」をイメージするかもしれませんが、ここで言うエラーは少し違います。Pythonが「あれ?これ、どうすればいいの?」と、予期せぬ事態に遭遇した時に発する「助けてサイン」のようなものです。
例えば、
- 数字で割り算をしようとしたら、分母が
0だった。(ゼロで割ることはできませんよね) - ファイルを開こうとしたら、指定した場所にファイルが存在しなかった。
- 文字を入力してほしいのに、数字が入力された。
このような「普段は大丈夫だけど、特定の条件で困っちゃうこと」をPythonでは「例外(Exception)」と呼びます。
try-exceptは、この「例外」が発生しそうな処理をあらかじめ予測して、「もしも例外が起きたら、こう対処してね」とPythonに指示する仕組みなんです。
基本的な形はこんな感じになります。
python
try:
# ここに「もしかしたらエラーが起きるかもしれない」処理を書く
# 例外(エラー)が起きなければ、tryブロックの処理が最後まで実行される
except 発生する可能性のあるエラー名:
# tryブロックで例外が発生したら、tryブロックの残りの処理はスキップされ、
# ここに書いた「エラーが起きたときの対処法」が実行される
一番簡単なtry-exceptを使ってみよう!
実際に簡単な例でtry-exceptを使ってみましょう。
よくあるのが「ゼロ除算」のエラーです。
エラーで止まるコードの例
まずはtry-exceptを使わない場合です。
“`python
エラーで止まる例
print(“計算を開始します”)
numerator = 10 # 割られる数
denominator = 0 # 割る数(ゼロなのでエラーになる!)
result = numerator / denominator # ここで ZeroDivisionError が発生!
print(f”計算結果: {result}”)
print(“計算を終了します”)
“`
このコードを実行すると、resultを計算する部分でZeroDivisionErrorが発生し、プログラムは途中で停止してしまいます。最後の「計算を終了します」も表示されません。
try-exceptでエラーを乗り越える!
先ほどのコードをtry-exceptで囲んでみましょう。
“`python
try-except を使ってエラーを処理する例
print(“計算を開始します”)
numerator = 10 # 割られる数
denominator = 0 # 割る数(ゼロなのでエラーになる!)
try:
result = numerator / denominator # ここで ZeroDivisionError が発生するかも
print(f”計算結果: {result}”)
except ZeroDivisionError: # ZeroDivisionError が発生したらここが実行される
print(“エラーが発生しました: 0で割ることはできません。”)
result = “エラー” # エラー時には結果を「エラー」という文字列にするなど、適切な処理をする
print(f”最終結果: {result}”)
print(“計算を終了します”)
“`
実行結果
計算を開始します
エラーが発生しました: 0で割ることはできません。
最終結果: エラー
計算を終了します
どうでしょうか?
今度は赤いエラーメッセージで止まることなく、「エラーが発生しました: 0で割ることはできません。」というメッセージが表示され、さらに「計算を終了します」まで無事に実行されました!
tryブロックの中でZeroDivisionErrorが発生したため、その瞬間にexcept ZeroDivisionError:のブロックに処理が移り、エラーを回避しながらプログラムを最後まで実行できたわけです。
どんなエラーでも一旦捕まえる万能薬(ただし注意点あり)
「エラーの種類を毎回覚えるのは大変そう…」と感じたあなた、ご安心ください。Pythonには、どんな種類の例外でもとりあえずキャッチできる「万能薬」のようなexceptの書き方があります。
それは、except Exception as e:と書く方法です。
“`python
どんなエラーでもキャッチする例
print(“処理を開始します”)
try:
# ゼロ除算エラーの例
value = 10 / 0
# または、型変換エラーの例
# value = int(“これは数字じゃない”)
print(f”結果: {value}”)
except Exception as e: # どんな例外でもキャッチして、その情報を変数 e に入れる
print(f”予期せぬエラーが発生しました!詳細: {e}”)
value = None # エラー時は何もしない、または特定の値を設定する
print(f”処理完了時の値: {value}”)
print(“処理を終了します”)
“`
実行結果(ゼロ除算の場合)
処理を開始します
予期せぬエラーが発生しました!詳細: division by zero
処理完了時の値: None
処理を終了します
except Exception as e:を使えば、具体的なエラーの種類が分からなくても、ひとまずプログラムが止まるのを防ぐことができます。as eとすることで、発生したエラーのメッセージ(上記の例だとdivision by zero)をeという変数に入れて表示できるので、エラーが起きた時に何が問題だったのかを知る手がかりになります。
注意点: どんなエラーでもキャッチできるのは便利ですが、これは「どんなエラーでも同じように処理する」ということでもあります。本当はファイルが見つからなかったのか、計算間違いだったのかなど、エラーの種類によって対処を変えたい場合は、次に説明する「特定のエラーだけをキャッチする方法」を使う方が良いでしょう。まずは動かす、という時には非常に有効です!
特定のエラーだけをキャッチする方法
もう少し応用して、エラーの種類によって違う対応をしたい場合は、複数のexceptブロックを並べて書くことができます。
例えば、「数字を入力してください」という場面で、
- 文字列を入力されて数字に変換できない(
ValueError) - 数字は入ったけど、ゼロだったので割り算ができない(
ZeroDivisionError)
という2つのエラーをそれぞれ別のメッセージで処理してみましょう。
“`python
print(“数値の割り算ゲームを開始します!”)
try:
num1_str = input(“割られる数を入力してください: “)
num1 = int(num1_str) # ここでValueErrorが起きるかも
num2_str = input("割る数を入力してください: ")
num2 = int(num2_str) # ここでValueErrorが起きるかも
result = num1 / num2 # ここでZeroDivisionErrorが起きるかも
print(f"計算結果: {num1} ÷ {num2} = {result}")
except ValueError: # 数字じゃないものが入力されたら
print(“エラー!数字以外が入力されました。数値で入力してください。”)
except ZeroDivisionError: # 0で割ろうとしたら
print(“エラー!0で割ることはできません。別の数を入力してください。”)
except Exception as e: # 上記以外の予期せぬエラーが起きたら
print(f”予期せぬエラーが発生しました!開発者に連絡してください。詳細: {e}”)
print(“ゲームを終了します。”)
“`
実行例1:数字以外を入力
数値の割り算ゲームを開始します!
割られる数を入力してください: hoge
エラー!数字以外が入力されました。数値で入力してください。
ゲームを終了します。
実行例2:0で割る
数値の割り算ゲームを開始します!
割られる数を入力してください: 10
割る数を入力してください: 0
エラー!0で割ることはできません。別の数を入力してください。
ゲームを終了します。
このように、エラーの種類ごとに対応するexceptブロックを書くことで、より親切で分かりやすいプログラムを作ることができます。except Exception as e:は、どんなエラーにも対応できるように一番最後に置いておくのがおすすめです。
まとめ:エラーを味方につけて、もっと楽になろう!
try-exceptを使えば、もうエラーでプログラムが突然止まって、作業が中断される…なんてことに悩まされずに済みます。
tryブロック: エラーが起こるかもしれない処理をここに書く。exceptブロック:tryブロックでエラーが起きた時の対処法をここに書く。特定のエラー名を指定したり、Exceptionでまとめて処理したりできる。
「エラー」は、プログラムがより賢く、より頑丈になるための大切なヒントです。try-exceptを使いこなせば、あなたが作ったプログラムは、ちょっとやそっとのトラブルでは動じない、頼りになるツールへと進化します。
「エラーで困っている、楽をしたい初心者」のあなたにとって、try-exceptはまさに業務効率化の大きな一歩になるはずです。ぜひ色々なコードで試して、エラーと上手に付き合っていくコツを掴んでくださいね!

コメント