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.
GO TO FULL VERSION