Traceback

Python SELF VI
Mức độ , Bài học
Có sẵn

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.

1
Khảo sát/đố vui
, cấp độ , bài học
Không có sẵn
Lỗi và ngoại lệ
Lỗi và ngoại lệ
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION