Pythonで例外が発生した際、その詳細なメッセージやデバッグ情報をキャプチャすることは、エラーの原因を特定する上で非常に重要です。以下に、その方法を解説します。

基本的な例外メッセージの取得方法

例外処理では、str(e)を使用してエラーメッセージを取得するのが一般的です。

try:
    1 / 0
except ZeroDivisionError as e:
    print(str(e))  # 出力: division by zero

例外の詳細を取得する方法

repr(e)を使うと、例外クラス名とメッセージを一緒に出力できます。

try:
    [][2]
except IndexError as e:
    print(repr(e))  # 出力: IndexError('list index out of range')

スタックトレースを含めたログの記録

loggingモジュールのlogger.exception()を使うことで、エラーのスタックトレースを含むログを簡単に記録できます。例外発生時に、自動的にトレースバックを出力してくれるため、デバッグ時に非常に有用です。

import logging
logging.basicConfig(level=logging.ERROR)
try:
    1 / 0
except ZeroDivisionError as e:
    logging.exception("An error occurred")  # ログにスタックトレースを記録

sys.exc_info()の使用

sys.exc_info()を使用すると、発生した例外の詳細な情報(例外のタイプ、値、トレースバック)を取得することができます。これは、エラーメッセージやスタックトレースを手動で処理したい場合に便利です。

import sys
import traceback
try:
    1 / 0
except Exception:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    print(f"Exception type: {exc_type}")
    print(f"Exception message: {exc_value}")
    print(f"Traceback: {traceback.format_tb(exc_traceback)}")

まとめ

Pythonでの例外処理は、単にエラーをキャッチするだけでなく、そのメッセージやスタックトレースを正しく取得・記録することが重要です。str(e)repr(e)で例外メッセージを取得し、logger.exception()でスタックトレースを含む詳細なログを記録することで、エラーの発生原因を迅速に特定できます。