5.1 Mô-đun traceback
Traceback — là thông tin cho thấy trình tự các lời gọi hàm dẫn đến việc xuất hiện ngoại lệ. Đó là công cụ quan trọng để gỡ lỗi, vì nó giúp lập trình viên hiểu, ở đâu và tại sao xảy ra lỗi.
Phân tích traceback — là một phần quan trọng trong việc gỡ lỗi chương trình, cho phép các lập trình viên hiểu, ở đâu và tại sao xảy ra lỗi. Python cung cấp mô-đun traceback, chứa các hàm để làm việc với việc theo dõi ngăn xếp. Mô-đun này cho phép trích xuất, định dạng và hiển thị thông tin về traceback.
Nhận và làm việc với traceback
Để làm việc với traceback bạn cần import mô-đun traceback, mô-đun này cung cấp các hàm để định dạng và hiển thị thông tin về theo dõi ngăn xếp.
Ví dụ về việc nhận và hiển thị traceback:
import traceback
def function_c():
return 1 / 0 # Điều này sẽ gây ra ZeroDivisionError
def function_b():
function_c()
def function_a():
try:
function_b()
except ZeroDivisionError as e:
print("Đã xảy ra ngoại lệ:")
traceback.print_exc() # In traceback
function_a()
Output:
Đã xảy ra ngoại lệ:
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
Hàm traceback.print_exc()
Hàm này in traceback của ngoại lệ hiện tại vào luồng lỗi chuẩn.
Ví dụ:
try:
1 / 0
except ZeroDivisionError:
traceback.print_exc()
Hàm traceback.format_exc()
Hàm này trả về một chuỗi với traceback của ngoại lệ hiện tại được định dạng.
try:
1 / 0
except ZeroDivisionError:
error_message = traceback.format_exc()
print("Traceback nhận được dưới dạng chuỗi:")
print(error_message)
Hàm traceback.extract_tb(tb)
Hàm này trích xuất thông tin "thô" về theo dõi ngăn xếp từ đối tượng traceback, có thể nhận được thông qua sys.exc_info(). Trả về danh sách các khung ngăn xếp.
5.2 Xử lý và phân tích traceback
Hàm traceback.format_tb(tb)
Hàm này trả về danh sách các dòng được định dạng, đại diện cho traceback.
import sys
import traceback
def function_c():
return 1 / 0 # Điều này sẽ gây ra 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("Traceback được định dạng:")
for line in formatted_tb:
print(line, end="")
function_a()
Hàm traceback.format_exception(exc_type, exc_value, exc_tb)
Hàm này trả về danh sách các dòng được định dạng đầy đủ, đại diện cho ngoại lệ và traceback.
import sys
import traceback
def function_c():
return 1 / 0 # Điều này sẽ gây ra 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("Traceback đầy đủ được định dạng:")
for line in full_tb:
print(line, end="")
function_a()
Đôi khi có ích nếu phân tích chi tiết từng khung ngăn xếp, để có được thông tin cụ thể về nơi xảy ra ngoại lệ và bối cảnh của nơi đó.
import traceback
import sys
def function_c():
return 1 / 0 # Điều này sẽ gây ra 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"Tệp: {frame.filename}")
print(f"Dòng: {frame.lineno}")
print(f"Tên hàm: {frame.name}")
print(f"Văn bản: {frame.line}")
print("-" * 40)
function_a()
5.3 Sử dụng traceback cho việc ghi log
Đôi khi quan trọng để lưu trữ thông tin về traceback trong file log để phân tích thêm. Điều này có thể được thực hiện bằng cách sử dụng các hàm của mô-đun traceback và mô-đun tiêu chuẩn logging.
Ví dụ:
import logging
import traceback
import sys
logging.basicConfig(filename='error.log', level=logging.ERROR)
def function_c():
return 1 / 0 # Điều này sẽ gây ra 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("Đã xảy ra ngoại lệ:\n%s", ''.join(full_tb))
function_a()
Chúng ta sẽ xem xét logging sau một chút, nhưng mình nghĩ thông tin này đã hữu ích cho bạn.
GO TO FULL VERSION