CodeGym /Javaコース /Python SELF JA /スタックトレース

スタックトレース

Python SELF JA
レベル 17 , レッスン 4
使用可能

5.1 モジュール traceback

スタックトレース (traceback)は、例外を引き起こした関数呼び出しの順序を示す情報だよ。デバッグの重要なツールで、どこで、なぜエラーが発生したのかを開発者が理解するのに役立つんだ。

スタックトレース (traceback)の分析はプログラムのデバッグにおいて重要で、どこで、なぜエラーが発生したのかを開発者が理解する手助けをしてくれる。Pythonはモジュール tracebackを提供していて、スタックトレースを扱うための関数が含まれている。これでスタックトレースの情報を抽出、フォーマット、表示できるんだ。

スタックトレースの取得と処理

スタックトレースを扱うには、モジュールtracebackをインポートする必要があって、それにはスタックトレースの形式と表示のための関数が提供されているよ。

スタックトレースの取得と表示の例:


import traceback

def function_c():
    return 1 / 0  # これはZeroDivisionErrorを引き起こすよ
            
def function_b():
    function_c()
            
def function_a():
    try:
        function_b()
    except ZeroDivisionError as e:
        print("例外が発生しました:")
        traceback.print_exc()  # スタックトレースを印刷します
            
function_a()

出力:


例外が発生しました:
Traceback (most recent call last):
    File "example.py", line 12, in function_a
      function_b()
    File "example.py", line 8, in function_b
      function_c()
    File "example.py", line 4, in function_c
      return 1 / 0
ZeroDivisionError: division by zero

関数 traceback.print_exc()

この関数は、現在の例外のスタックトレースを標準エラーストリームに印刷するよ。

例:


try:
    1 / 0
except ZeroDivisionError:
    traceback.print_exc()

関数 traceback.format_exc()

この関数は、現在の例外のフォーマットされたスタックトレースを文字列として返すんだ。


try:
    1 / 0
except ZeroDivisionError:
    error_message = traceback.format_exc()
    print("取得したスタックトレースは文字列として:")
    print(error_message)    

関数 traceback.extract_tb(tb)

この関数は、sys.exc_info()を通じて取得できるトレースバックオブジェクト(traceback object)から"生"のスタックトレース情報を抽出するよ。スタックフレームのリストを返すんだ。

5.2 スタックトレースの処理と分析

関数 traceback.format_tb(tb)

この関数は、スタックトレースを表すフォーマットされた文字列リストを返すよ。


import sys
import traceback

def function_c():
    return 1 / 0  # これはZeroDivisionErrorを引き起こすよ
            
def function_b():
    function_c()
            
def function_a():
    try:
        function_b()
    except ZeroDivisionError:
        tb = sys.exc_info()[2]
        formatted_tb = traceback.format_tb(tb)
        print("フォーマットされたスタックトレース:")
        for line in formatted_tb:
            print(line, end="")
            
function_a()

関数 traceback.format_exception(exc_type, exc_value, exc_tb)

この関数は、例外とスタックトレースを表す完全なフォーマット済みの文字列リストを返すよ。


import sys
import traceback

def function_c():
    return 1 / 0  # これはZeroDivisionErrorを引き起こすよ
            
def function_b():
    function_c()
            
def function_a():
    try:
        function_b()
    except ZeroDivisionError as e:
        exc_type, exc_value, exc_tb = sys.exc_info()
        full_tb = traceback.format_exception(exc_type, exc_value, exc_tb)
        print("完全なフォーマット済みスタックトレース:")
        for line in full_tb:
            print(line, end="")
            
function_a()

時には、スタックフレームをより詳細に分析して、どこで例外が発生したのか、その場所の文脈について具体的な情報を得るのが役に立つことがあるよ。


import traceback
import sys

def function_c():
    return 1 / 0  # これはZeroDivisionErrorを引き起こすよ
            
def function_b():
    function_c()
            
def function_a():
    try:
        function_b()
    except ZeroDivisionError:
        tb = sys.exc_info()[2]
        for frame in traceback.extract_tb(tb):
            print(f"ファイル: {frame.filename}")
            print(f"行: {frame.lineno}")
            print(f"関数名: {frame.name}")
            print(f"テキスト: {frame.line}")
            print("-" * 40)
            
function_a()

5.3 tracebackを使ったログ記録

時には、スタックトレースの情報をログファイルに保存して後で分析することが重要なんだ。それはモジュールtracebackの関数と標準のモジュール loggingを使ってできるよ。

例:


import logging
import traceback
import sys

logging.basicConfig(filename='error.log', level=logging.ERROR)
            
def function_c():
    return 1 / 0  # これはZeroDivisionErrorを引き起こすよ
            
def function_b():
    function_c()
            
def function_a():
    try:
        function_b()
    except ZeroDivisionError as e:
        exc_type, exc_value, exc_tb = sys.exc_info()
        full_tb = traceback.format_exception(exc_type, exc_value, exc_tb)
        logging.error("例外が発生しました:\n%s", ''.join(full_tb))
            
function_a()

ロギングについてはもうちょっと後で見るけど、この情報が役立ったらいいな。

1
Опрос
エラーと例外,  17 уровень,  4 лекция
недоступен
エラーと例外
エラーと例外
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION