【Python 文法】例外処理の基本!try-exceptの使い方を初心者向けに徹底解説

Python

Pythonプログラミングをしていると、予期せぬエラーに遭遇することは避けられません。そんな時、プログラムが突然停止してしまっては困りますよね。

この記事を読めば、Pythonの「例外処理」を理解し、エラーが発生してもプログラムを止めずに、適切に対処する方法を学ぶことができます。

try...exceptという基本的な構文から、finallyraiseといった応用的な使い方まで、初心者の方にも分かりやすく解説していきます。

Pythonの例外処理とは?エラーハンドリングの重要性

まず結論から言うと、例外処理とはプログラム実行中に発生したエラー(例外)を検知し、それに対する処理を記述する仕組みのことです。これを「エラーハンドリング」とも呼びます。

例外処理がないとどうなる?

例えば、ユーザーに数字を入力してもらい、それで割り算をするプログラムを考えてみましょう。もしユーザーが「0」を入力したらどうなるでしょうか?

# 例外処理がない場合
num = int(input("割る数を入力してください: "))
result = 100 / num # ゼロ除算エラーが発生
print(f"計算結果: {result}")

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

このコードで「0」を入力すると、ZeroDivisionError: division by zeroというエラーメッセージが表示され、プログラムはその場で強制終了してしまいます。最後の「プログラムが終了しました。」という行は実行されません。

例外処理(エラーハンドリング)のメリット

例外処理を導入することで、このような事態を避けることができます。

  • プログラムの強制終了を防ぐ
  • エラー発生時に代替処理を行う(例: エラーメッセージを分かりやすく表示する)
  • エラーの原因を記録(ロギング)する
  • リソース(ファイルなど)を確実に解放する

このように、堅牢で安定したプログラムを作るためには、例外処理が不可欠です。

最も基本的な構文 try...except

例外処理の基本は、tryブロックとexceptブロックを使うことです。

  • try: エラーが発生する可能性のあるコードをこのブロックに書きます。
  • except: tryブロック内でエラーが発生した場合に、このブロックのコードが実行されます。

try...except の書き方

これが最もシンプルな形です。tryでエラーが起きなければexceptは無視され、エラーが起きればexcept内の処理が実行されます。

try:
    # エラーが発生する可能性のある処理
    ...
except:
    # エラーが発生した時の処理
    ...

具体的なコード例:ZeroDivisionError

先ほどのゼロ除算の例に、try...exceptを適用してみましょう。

# 例外処理がある場合
try:
    num = int(input("割る数を入力してください: "))
    result = 100 / num
    print(f"計算結果: {result}")
except:
    print("エラーが発生しました。0以外の数を入力してください。")

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

このコードで「0」を入力すると、エラーでプログラムが止まる代わりに、「エラーが発生しました。0以外の数を入力してください。」というメッセージが表示され、最後の行まできちんと実行されます

特定の例外だけを捕捉する方法

exceptの後に例外クラス名(エラーの種類)を指定することで、特定のエラーが発生した時だけ処理を実行できます。

これにより、予期せぬ他のエラー(例えば、文字を入力された時のValueError)と処理を分けることができ、より丁寧なエラーハンドリングが可能になります。

try:
    num = int(input("割る数を入力してください: "))
    result = 100 / num
    print(f"計算結果: {result}")
except ZeroDivisionError: # ZeroDivisionErrorだけを捕捉
    print("0で割ることはできません。")
except ValueError: # ValueErrorだけを捕捉
    print("数字を入力してください。")

複数の例外をまとめて捕捉する方法

複数の例外に対して同じ処理を行いたい場合は、例外クラスをタプルでまとめて指定できます。

try:
    # ... 処理 ...
except (ZeroDivisionError, ValueError):
    print("入力が正しくありません。0以外の数字を入力してください。")

例外の詳細情報を取得する as

エラーに関する詳細な情報(エラーメッセージなど)を取得したい場合は、asを使って例外オブジェクトを変数に格納します。

try:
    num = int(input("割る数を入力してください: "))
    result = 100 / num
    print(f"計算結果: {result}")
except ValueError as e:
    print(f"値のエラーが発生しました: {e}") # エラーメッセージを表示
except ZeroDivisionError as e:
    print(f"ゼロ除算エラーが発生しました: {e}")

応用的な例外処理の構文

try...exceptに加えてelsefinallyを組み合わせることで、さらに柔軟な制御が可能になります。

エラーが起きなかった時だけ実行する else

tryブロックの処理がエラーなく正常に完了した場合にのみelseブロックの処理が実行されます。

try:
    num = int(input("数字を入力してください: "))
except ValueError:
    print("数字ではないものが入力されました。")
else:
    # tryブロックが成功した場合のみ実行
    print(f"入力された数字は {num} です。")

この例では、正常に数字が入力された場合のみ、「入力された数字は…」というメッセージが表示されます。

成功しても失敗しても必ず実行する finally

finallyブロックは、tryブロック内でエラーが発生したかどうかに関わらず、必ず最後に実行される処理です。

ファイルのクローズ処理や、データベースの接続解除など、後片付けが必要な処理を記述するのに非常に役立ちます。

f = None # 変数をあらかじめ定義
try:
    f = open('some_file.txt', 'r')
    # ... ファイル処理 ...
except FileNotFoundError:
    print("ファイルが見つかりませんでした。")
finally:
    # エラーがあってもなくても、ファイルが開かれていればクローズする
    if f:
        f.close()
        print("ファイルをクローズしました。")

意図的に例外を発生させる raise

raise文を使うと、プログラムの特定の条件で意図的に例外を発生させることができます。

raise の使い方と利用シーン

例えば、関数の引数が不正な値だった場合に、エラーとして処理を中断させたい時などに使います。

def check_age(age):
    if age < 0:
        # 不正な値なので、ValueErrorを発生させる
        raise ValueError("年齢に負の値は指定できません。")
    print(f"あなたの年齢は {age} 歳です。")

try:
    check_age(20)
    check_age(-5) # ここでValueErrorが発生
except ValueError as e:
    print(f"エラー: {e}")

出力結果:

あなたの年齢は 20 歳です。
エラー: 年齢に負の値は指定できません。

これにより、不正なデータが後続の処理に渡るのを防ぐことができます。

よく遭遇する代表的な例外クラス

Pythonには多くの組み込み例外クラスがあります。ここでは代表的なものをいくつか紹介します。

例外クラス説明
ValueError値は正しい型だが、不適切な値を持つ場合に発生
TypeError操作や関数が不適切な型のオブジェクトに適用された場合に発生
IndexErrorシーケンス(リストなど)の範囲外のインデックスを指定した場合に発生
KeyError辞書(dict)に存在しないキーを指定した場合に発生
FileNotFoundError存在しないファイルを開こうとした場合に発生

Google スプレッドシートにエクスポート

これらのエラー名を見たら、「あ、こういう原因か」と推測できるようになると、デバッグが格段に楽になります。

まとめ

今回はPythonの例外処理について、基本的なtry...exceptから応用まで解説しました。

  • 例外処理はエラーによるプログラムの強制終了を防ぐための仕組み
  • **try...except**が基本。エラーが起きうる処理をtryに、起きた時の処理をexceptに書く
  • **else**はtryが成功した時だけ実行される
  • **finally**はエラーの有無にかかわらず、必ず最後に実行される
  • **raise**は意図的にエラーを発生させたい時に使う

エラーは怖いものではなく、適切に対処すればプログラムをより安全で使いやすくしてくれます。ぜひ積極的に例外処理を活用して、ワンランク上のプログラミングを目指してください。

コメント

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