4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PythonAdvent Calendar 2024

Day 9

Python における例外処理 まとめ

Last updated at Posted at 2024-12-25

はじめに

本記事では Python の例外処理についてまとめています。

例外処理は、プログラムの実行中に予期せぬエラーが発生した場合に、プログラムを正常に終了させたり、適切な処理を行うための仕組みです。これにより、プログラムの安定性と信頼性を高めることができます。

例外の種類

Pythonでは、様々な種類の例外が定義されています。

  • ZeroDivisionError: ゼロで除算しようとした場合に発生
  • NameError: 未定義の変数や関数を参照しようとした場合に発生
  • TypeError: オブジェクトの型が間違っている場合に発生
  • KeyError: 辞書型でキーが存在しない場合に発生
  • FileNotFoundError: ファイルが存在しない場合に発生

例外処理の基礎

Pythonでは、try-except ブロックを用いて例外処理を行います。

try:
    # エラーが発生する可能性のあるコード
    x = 10 / 0
except ZeroDivisionError:
    # ZeroDivisionError 発生時の処理
    x = 0
  • try ブロック
    エラーが発生する可能性のあるコードを記述。
  • except ブロック
    特定のエラーが発生した場合に実行されるコードを記述。

finally ブロック

必ず実行したい処理がある場合は、finally ブロックを使用します。

try:
    f = open("my_file.txt", "r")
    data = f.read()
    # データの処理
except FileNotFoundError:
    print("ファイルが見つかりません")
finally:
    f.close()
    print("ファイルを閉じました")

else ブロック

try ブロック内のコードが例外なしに正常に実行された場合にのみ実行されるブロックです。

try:
    # 例外が発生する可能性のあるコード
    result = 10 / 2
except ZeroDivisionError:
    print("ゼロで除算することはできません")
else:
    print("計算結果は:", result)

複数の例外処理

複数の例外に対応するためには、複数の except 句を使います。

try:
    x = 10 / 0
except ZeroDivisionError:
    x = 0
except TypeError:
    x = 10

入れ子状の try-except ブロック

入れ子構造により、それぞれのレベルで別々の例外を処理できます。

import requests

def get_webpage_data(url):
    try:
        response = requests.get(url)
        response.raise_for_status()  # ステータスコードが異常な場合に例外を発生させる

        try:
            # 取得したHTMLを解析する処理
            # ...
        except ValueError:
            print("HTMLの解析中にエラーが発生しました")
    except requests.exceptions.RequestException as e:
        print(f"リクエスト中にエラーが発生しました: {e}")

例外の再投げ

例外を抜け消すのではなく、最上レベルに再投げする場合に使用します。

try:
    try:
        result = 1 / 0
    except ZeroDivisionError as e:
        print("内部で例外を処理")
        raise  # 再投げ
except Exception as e:
    print(f"グローバルな例外処理: {e}")

エラー情報を収集する方法

例外発生時に詳細なエラー情報を取得するには、以下の方法を使用できます。

except 句で変数を使用

try:
    result = 1 / 0
except Exception as e:
    print(f"エラータイプ: {type(e).__name__}, 詳細: {e}")

sys.exc_info() を使用

import sys

try:
    result = 1 / 0
except:
    exc_type, exc_obj, exc_traceback = sys.exc_info()
    print(f"エラータイプ: {exc_type.__name__}, 詳細: {exc_obj}")

traceback モジュールを使用

import traceback

try:
    result = 1 / 0
except Exception as e:
    print("\n".join(traceback.format_exception(None, e, e.__traceback__)))
4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?