Stack Trace

Python SELF AZ
Səviyyə , Dərs
Mövcuddur

5.1 Modul traceback

Stack-trace (traceback) — bu funksiyaların ardıcıl çağırışlarını göstərən və istisnanın baş verməsinə səbəb olan məlumatdır. Bu, debugging üçün vacib bir alətdir, çünki proqramçılar üçün səhvin harada və niyə baş verdiyini anlamağa kömək edir.

Stack-trace analiz etmek (traceback) proqram debugging-in vacib bir hissəsidir, çünki bu, proqramçılara səhvin harada və niyə baş verdiyini anlamağa kömək edir. Python stack trace-lər ilə işləmək üçün funksiyalar ehtiva edən modul traceback təmin edir. Bu modul stack-trace-lər haqqında məlumat çıxarmağa, formatlaşdırmağa və çap etməyə imkan verir.

Stack-trace əldə etmək və onunla işləmək

Stack-trace ilə işləmək üçün traceback modulunu import etmək lazımdır, bu isə stack trace haqqında məlumatı formatlaşdırmaq və çıxış etmək üçün funksiyalar təqdim edir.

Stack-trace əldə etmək və çıxış etmək üçün nümunə:


import traceback

def function_c():
    return 1 / 0  # Bu, ZeroDivisionError yaradacaq
            
def function_b():
    function_c()
            
def function_a():
    try:
        function_b()
    except ZeroDivisionError as e:
        print("İstisna baş verdi:")
        traceback.print_exc()  # Stack-trace-i çap edir
            
function_a()

Nəticə:


İstisna baş verdi:
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() funksiyası

Bu funksiya cari istisnanın stack-trace-ni standart error axınına çap edir.

Nümunə:


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

traceback.format_exc() funksiyası

Bu funksiya cari istisnanın formatlaşdırılmış stack-trace-ni bir string olaraq qaytarır.


try:
    1 / 0
except ZeroDivisionError:
    error_message = traceback.format_exc()
    print("String kimi əldə olunan stack-trace:")
    print(error_message)    

traceback.extract_tb(tb) funksiyası

Bu funksiya sys.exc_info() vasitəsi ilə əldə edilə bilən trace obyektindən məlumat çıxarır. Funksiya stack freymlərinin siyahısını qaytarır.

5.2 Stack-trace-nin işlənməsi və analizi

traceback.format_tb(tb) funksiyası

Bu funksiya stack-trace-i təmsil edən formatlaşdırılmış sətirlərin siyahısını qaytarır.


import sys
import traceback

def function_c():
    return 1 / 0  # Bu ZeroDivisionError yaradacaq
            
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("Formatlaşdırılmış stack-trace:")
        for line in formatted_tb:
            print(line, end="")
            
function_a()

traceback.format_exception(exc_type, exc_value, exc_tb) funksiyası

Bu funksiya istisnanı və stack-trace-i təmsil edən tam formatlaşdırılmış sətirlərin siyahısını qaytarır.


import sys
import traceback

def function_c():
    return 1 / 0  # Bu ZeroDivisionError yaradacaq
            
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("Tam formatlaşdırılmış stack-trace:")
        for line in full_tb:
            print(line, end="")
            
function_a()

Bəzən istisnanın baş verdiyi yeri və həmin yerin kontekstini daha dəqiq öyrənmək üçün hər bir stack-frame-i daha detallı şəkildə təhlil etmək faydalı olur.


import traceback
import sys

def function_c():
    return 1 / 0  # Bu ZeroDivisionError yaradacaq
            
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"Fayl: {frame.filename}")
            print(f"Sətir: {frame.lineno}")
            print(f"Funksiya adı: {frame.name}")
            print(f"Mətn: {frame.line}")
            print("-" * 40)
            
function_a()

5.3 traceback-dən log yazmaq üçün istifadə

Bəzən stack-trace haqda olan məlumatı log fayla yazmaq vacibdir ki, sonradan analiz edə biləsən. Bunun üçün traceback modulunun funksiyalarını və standart logging modulunu istifadə edə bilərsən.

Nümunə:


import logging
import traceback
import sys

logging.basicConfig(filename='error.log', level=logging.ERROR)
            
def function_c():
    return 1 / 0  # Bu ZeroDivisionError atacaq
            
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("Xəta baş verdi:\n%s", ''.join(full_tb))
            
function_a()

Logging mövzusuna bir az sonra qayıdacağıq, amma düşünürəm ki, bu məlumat sənin üçün faydalı oldu.

1
Опрос
Xətalar və istisnalar,  17 уровень,  4 лекция
недоступен
Xətalar və istisnalar
Xətalar və istisnalar
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION