try-exceptを利用し エラーと「良い関係」を築く方法

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ブロックを並べて書くことができます。

例えば、「数字を入力してください」という場面で、

  1. 文字列を入力されて数字に変換できない(ValueError
  2. 数字は入ったけど、ゼロだったので割り算ができない(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はまさに業務効率化の大きな一歩になるはずです。ぜひ色々なコードで試して、エラーと上手に付き合っていくコツを掴んでくださいね!

コメント

タイトルとURLをコピーしました