traceback --- In hoặc truy xuất dấu vết ngăn xếp

Source code: Lib/traceback.py


Mô-đun này cung cấp giao diện chuẩn để trích xuất, định dạng và in dấu vết ngăn xếp của các chương trình Python. Nó linh hoạt hơn hiển thị truy ngược mặc định của trình thông dịch và do đó có thể định cấu hình các khía cạnh nhất định của đầu ra. Cuối cùng, nó chứa một tiện ích để thu thập đủ thông tin về một ngoại lệ để in sau này mà không cần lưu tham chiếu đến ngoại lệ thực tế. Vì các ngoại lệ có thể là gốc của biểu đồ đối tượng lớn nên tiện ích này có thể cải thiện đáng kể việc quản lý bộ nhớ.

Mô-đun sử dụng traceback objects --- đây là các đối tượng thuộc loại types.TracebackType, được gán cho trường __traceback__ của các phiên bản BaseException.

Xem thêm

Mô-đun faulthandler

Được sử dụng để kết xuất các dấu vết Python một cách rõ ràng, khi có lỗi, sau khi hết thời gian chờ hoặc theo tín hiệu của người dùng.

Mô-đun pdb

Trình gỡ lỗi mã nguồn tương tác cho các chương trình Python.

API của mô-đun có thể được chia thành hai phần:

  • Các hàm cấp mô-đun cung cấp chức năng cơ bản, hữu ích cho việc kiểm tra tương tác các ngoại lệ và truy nguyên.

  • Lớp TracebackException và các lớp trợ giúp của nó StackSummaryFrameSummary. Những tính năng này mang lại sự linh hoạt hơn trong kết quả đầu ra được tạo ra và khả năng lưu trữ thông tin cần thiết cho việc định dạng sau này mà không cần giữ tham chiếu đến các đối tượng ngoại lệ và truy nguyên thực tế.

Added in version 3.13: Đầu ra được tô màu theo mặc định và có thể là controlled using environment variables.

Chức năng cấp mô-đun

traceback.print_tb(tb, limit=None, file=None)

In tối đa các mục theo dõi ngăn xếp limit từ traceback object tb (bắt đầu từ khung của người gọi) nếu limit là dương. Nếu không, hãy in các mục abs(limit) cuối cùng. Nếu limit bị bỏ qua hoặc None, tất cả các mục sẽ được in. Nếu file bị bỏ qua hoặc None, đầu ra sẽ chuyển sang sys.stderr; nếu không thì nó phải là file hoặc file-like object mở để nhận đầu ra.

Ghi chú

Ý nghĩa của tham số limit khác với ý nghĩa của sys.tracebacklimit. Giá trị limit âm tương ứng với giá trị dương của sys.tracebacklimit, trong khi hành vi của giá trị limit dương không thể đạt được với sys.tracebacklimit.

Thay đổi trong phiên bản 3.5: Đã thêm hỗ trợ limit tiêu cực.

traceback.print_exception(exc, /, [value, tb, ]limit=None, file=None, chain=True)

In thông tin ngoại lệ và xếp chồng các mục theo dõi từ traceback object tb đến file. Điều này khác với print_tb() ở những điểm sau:

  • nếu tb không phải là None, nó sẽ in tiêu đề Traceback (most recent call last):

  • nó in loại ngoại lệ và value sau dấu vết ngăn xếp

  • nếu type(value)SyntaxErrorvalue có định dạng phù hợp, nó sẽ in dòng xảy ra lỗi cú pháp kèm theo dấu mũ cho biết vị trí gần đúng của lỗi.

Kể từ Python 3.10, thay vì truyền valuetb, một đối tượng ngoại lệ có thể được truyền làm đối số đầu tiên. Nếu valuetb được cung cấp, đối số đầu tiên sẽ bị bỏ qua để cung cấp khả năng tương thích ngược.

Đối số limit tùy chọn có ý nghĩa tương tự như đối với print_tb(). Nếu chain là đúng (mặc định), thì các ngoại lệ được xâu chuỗi (thuộc tính __cause__ hoặc __context__ của ngoại lệ) cũng sẽ được in, giống như chính trình thông dịch thực hiện khi in một ngoại lệ chưa được xử lý.

Thay đổi trong phiên bản 3.5: Đối số etype bị bỏ qua và được suy ra từ loại value.

Thay đổi trong phiên bản 3.10: Tham số etype đã được đổi tên thành exc và hiện chỉ có vị trí.

traceback.print_exc(limit=None, file=None, chain=True)

Đây là cách viết tắt của print_exception(sys.exception(), limit=limit, file=file, chain=chain).

traceback.print_last(limit=None, file=None, chain=True)

Đây là cách viết tắt của print_exception(sys.last_exc, limit=limit, file=file, chain=chain). Nói chung, nó sẽ chỉ hoạt động sau khi một ngoại lệ đạt đến dấu nhắc tương tác (xem sys.last_exc).

traceback.print_stack(f=None, limit=None, file=None)

In tối đa các mục theo dõi ngăn xếp limit (bắt đầu từ điểm gọi) nếu limit dương. Nếu không, hãy in các mục abs(limit) cuối cùng. Nếu limit bị bỏ qua hoặc None, tất cả các mục sẽ được in. Đối số f tùy chọn có thể được sử dụng để chỉ định một stack frame thay thế để bắt đầu. Đối số file tùy chọn có ý nghĩa tương tự như đối với print_tb().

Thay đổi trong phiên bản 3.5: Đã thêm hỗ trợ limit tiêu cực.

traceback.extract_tb(tb, limit=None)

Trả về một đối tượng StackSummary đại diện cho một danh sách các mục theo dõi ngăn xếp "được xử lý trước" được trích xuất từ traceback object tb. Nó rất hữu ích cho việc định dạng thay thế các dấu vết ngăn xếp. Đối số limit tùy chọn có ý nghĩa tương tự như đối với print_tb(). Mục nhập dấu vết ngăn xếp "được xử lý trước" là đối tượng FrameSummary chứa các thuộc tính filename, lineno, nameline thể hiện thông tin thường được in cho dấu vết ngăn xếp.

traceback.extract_stack(f=None, limit=None)

Trích xuất dấu vết thô từ stack frame hiện tại. Giá trị trả về có cùng định dạng với extract_tb(). Các đối số flimit tùy chọn có ý nghĩa tương tự như đối với print_stack().

traceback.print_list(extracted_list, file=None)

In danh sách các bộ dữ liệu được trả về bởi extract_tb() hoặc extract_stack() dưới dạng dấu vết ngăn xếp được định dạng cho tệp đã cho. Nếu fileNone, đầu ra được ghi vào sys.stderr.

traceback.format_list(extracted_list)

Đưa ra danh sách các bộ dữ liệu hoặc đối tượng FrameSummary được trả về bởi extract_tb() hoặc extract_stack(), hãy trả về danh sách các chuỗi sẵn sàng để in. Mỗi chuỗi trong danh sách kết quả tương ứng với mục có cùng chỉ mục trong danh sách đối số. Mỗi chuỗi kết thúc bằng một dòng mới; các chuỗi cũng có thể chứa các dòng mới nội bộ, đối với những mục có dòng văn bản nguồn không phải là None.

traceback.format_exception_only(exc, /, [value, ]*, show_group=False)

Định dạng phần ngoại lệ của truy nguyên bằng cách sử dụng giá trị ngoại lệ do sys.last_value đưa ra. Giá trị trả về là danh sách các chuỗi, mỗi chuỗi kết thúc bằng một dòng mới. Danh sách chứa thông báo của ngoại lệ, thường là một chuỗi đơn; tuy nhiên, đối với các ngoại lệ SyntaxError, nó chứa một số dòng (khi được in) hiển thị thông tin chi tiết về nơi xảy ra lỗi cú pháp. Theo sau thông báo, danh sách chứa notes của ngoại lệ.

Kể từ Python 3.10, thay vì truyền value, một đối tượng ngoại lệ có thể được truyền làm đối số đầu tiên. Nếu value được cung cấp, đối số đầu tiên sẽ bị bỏ qua để cung cấp khả năng tương thích ngược.

Khi show_groupTrue và ngoại lệ là một phiên bản của BaseExceptionGroup, các ngoại lệ lồng nhau cũng được bao gồm theo cách đệ quy, với mức thụt lề tương ứng với độ sâu lồng của chúng.

Thay đổi trong phiên bản 3.10: Tham số etype đã được đổi tên thành exc và hiện chỉ có vị trí.

Thay đổi trong phiên bản 3.11: Danh sách trả về hiện bao gồm mọi notes được đính kèm với ngoại lệ.

Thay đổi trong phiên bản 3.13: tham số show_group đã được thêm vào.

traceback.format_exception(exc, /, [value, tb, ]limit=None, chain=True)

Định dạng dấu vết ngăn xếp và thông tin ngoại lệ. Các đối số có cùng ý nghĩa với các đối số tương ứng với print_exception(). Giá trị trả về là danh sách các chuỗi, mỗi chuỗi kết thúc bằng một dòng mới và một số chứa các dòng mới bên trong. Khi các dòng này được nối và in, văn bản sẽ được in giống hệt như print_exception().

Thay đổi trong phiên bản 3.5: Đối số etype bị bỏ qua và được suy ra từ loại value.

Thay đổi trong phiên bản 3.10: Hành vi và chữ ký của hàm này đã được sửa đổi để phù hợp với print_exception().

traceback.format_exc(limit=None, chain=True)

Điều này giống như print_exc(limit) nhưng trả về một chuỗi thay vì in ra tệp.

traceback.format_tb(tb, limit=None)

Viết tắt của format_list(extract_tb(tb, limit)).

traceback.format_stack(f=None, limit=None)

Viết tắt của format_list(extract_stack(f, limit)).

traceback.clear_frames(tb)

Xóa các biến cục bộ của tất cả các khung ngăn xếp trong traceback tb bằng cách gọi phương thức clear() của mỗi frame object.

Added in version 3.4.

traceback.walk_stack(f)

Di chuyển một ngăn xếp theo f.f_back từ khung nhất định, mang lại khung và số dòng cho mỗi khung. Nếu fNone thì ngăn xếp hiện tại sẽ được sử dụng. Trình trợ giúp này được sử dụng với StackSummary.extract().

Added in version 3.5.

Thay đổi trong phiên bản 3.14: Hàm này trước đây đã trả về một trình tạo sẽ di chuyển ngăn xếp khi lặp lại lần đầu tiên. Trình tạo được trả về bây giờ là trạng thái của ngăn xếp khi walk_stack được gọi.

traceback.walk_tb(tb)

Walk a traceback following tb_next yielding the frame and line number for each frame. Trình trợ giúp này được sử dụng với StackSummary.extract().

Added in version 3.5.

Đối tượng TracebackException

Added in version 3.5.

Các đối tượng TracebackException được tạo từ các ngoại lệ thực tế để thu thập dữ liệu để in sau. Họ cung cấp một phương pháp lưu trữ thông tin này nhẹ hơn bằng cách tránh giữ các tham chiếu đến các đối tượng tracebackframe. Ngoài ra, chúng còn cung cấp nhiều tùy chọn hơn để định cấu hình đầu ra so với các chức năng cấp mô-đun được mô tả ở trên.

class traceback.TracebackException(exc_type, exc_value, exc_traceback, *, limit=None, lookup_lines=True, capture_locals=False, compact=False, max_group_width=15, max_group_depth=10)

Ghi lại một ngoại lệ để hiển thị sau này. Ý nghĩa của limit, lookup_linescapture_locals giống như đối với lớp StackSummary.

Nếu compact là đúng, chỉ dữ liệu được yêu cầu bởi phương thức format() của TracebackException mới được lưu trong thuộc tính lớp. Đặc biệt, trường __context__ chỉ được tính nếu __cause__None__suppress_context__ là sai.

Lưu ý rằng khi người dân địa phương bị bắt, họ cũng được hiển thị trong truy nguyên.

max_group_widthmax_group_depth kiểm soát định dạng của các nhóm ngoại lệ (xem BaseExceptionGroup). Độ sâu đề cập đến mức độ lồng nhau của nhóm và chiều rộng đề cập đến kích thước của mảng ngoại lệ của một nhóm ngoại lệ. Đầu ra được định dạng sẽ bị cắt bớt khi vượt quá một trong hai giới hạn.

Thay đổi trong phiên bản 3.10: Đã thêm tham số compact.

Thay đổi trong phiên bản 3.11: Đã thêm thông số max_group_widthmax_group_depth.

__cause__

Một TracebackException của __cause__ ban đầu.

__context__

Một TracebackException của __context__ ban đầu.

exceptions

Nếu self đại diện cho ExceptionGroup, trường này chứa danh sách các phiên bản TracebackException đại diện cho các ngoại lệ lồng nhau. Nếu không thì đó là None.

Added in version 3.11.

__suppress_context__

Giá trị __suppress_context__ từ ngoại lệ ban đầu.

__notes__

Giá trị __notes__ từ ngoại lệ ban đầu hoặc None nếu ngoại lệ không có bất kỳ ghi chú nào. Nếu nó không phải là None thì nó có được định dạng trong truy nguyên sau chuỗi ngoại lệ không.

Added in version 3.11.

stack

Một StackSummary đại diện cho truy nguyên.

exc_type

Lớp của truy nguyên ban đầu.

Sắp loại bỏ từ phiên bản 3.13.

exc_type_str

Hiển thị chuỗi của lớp ngoại lệ ban đầu.

Added in version 3.13.

filename

Đối với lỗi cú pháp - tên tệp xảy ra lỗi.

lineno

Đối với lỗi cú pháp - số dòng xảy ra lỗi.

end_lineno

Đối với lỗi cú pháp - số dòng cuối nơi xảy ra lỗi. Có thể là None nếu không có.

Added in version 3.10.

text

Đối với lỗi cú pháp - văn bản xảy ra lỗi.

offset

Đối với lỗi cú pháp - phần bù vào văn bản xảy ra lỗi.

end_offset

Đối với lỗi cú pháp - phần bù cuối vào văn bản nơi xảy ra lỗi. Có thể là None nếu không có.

Added in version 3.10.

msg

Đối với lỗi cú pháp - thông báo lỗi trình biên dịch.

classmethod from_exception(exc, *, limit=None, lookup_lines=True, capture_locals=False)

Ghi lại một ngoại lệ để hiển thị sau này. limit, lookup_linescapture_locals giống như lớp StackSummary.

Lưu ý rằng khi người dân địa phương bị bắt, họ cũng được hiển thị trong truy nguyên.

print(*, file=None, chain=True)

In ra file (sys.stderr mặc định) thông tin ngoại lệ được trả về bởi format().

Added in version 3.11.

format(*, chain=True)

Định dạng ngoại lệ.

Nếu chain không phải là True thì __cause____context__ sẽ không được định dạng.

Giá trị trả về là một trình tạo các chuỗi, mỗi chuỗi kết thúc bằng một dòng mới và một số chứa các dòng mới bên trong. print_exception() là một trình bao bọc xung quanh phương thức này, nó chỉ in các dòng vào một tệp.

format_exception_only(*, show_group=False)

Định dạng phần ngoại lệ của truy nguyên.

Giá trị trả về là một trình tạo chuỗi, mỗi chuỗi kết thúc bằng một dòng mới.

Khi show_groupFalse, trình tạo sẽ phát ra thông báo của ngoại lệ, theo sau là ghi chú của nó (nếu có). Thông báo ngoại lệ thường là một chuỗi đơn; tuy nhiên, đối với các ngoại lệ SyntaxError, nó bao gồm một số dòng (khi được in) hiển thị thông tin chi tiết về nơi xảy ra lỗi cú pháp.

Khi show_groupTrue và ngoại lệ là một phiên bản của BaseExceptionGroup, các ngoại lệ lồng nhau cũng được bao gồm theo cách đệ quy, với mức thụt lề tương ứng với độ sâu lồng của chúng.

Thay đổi trong phiên bản 3.11: notes của ngoại lệ hiện được bao gồm trong đầu ra.

Thay đổi trong phiên bản 3.13: Đã thêm tham số show_group.

Đối tượng StackSummary

Added in version 3.5.

Các đối tượng StackSummary đại diện cho một ngăn xếp cuộc gọi sẵn sàng để định dạng.

class traceback.StackSummary
classmethod extract(frame_gen, *, limit=None, lookup_lines=True, capture_locals=False)

Xây dựng đối tượng StackSummary từ trình tạo khung (chẳng hạn như được trả về bởi walk_stack() hoặc walk_tb()).

Nếu limit được cung cấp thì chỉ có bấy nhiêu khung hình được lấy từ frame_gen. Nếu lookup_linesFalse, các đối tượng FrameSummary được trả về sẽ chưa đọc dòng của chúng, khiến chi phí tạo StackSummary rẻ hơn (có thể có giá trị nếu nó không thực sự được định dạng). Nếu capture_localsTrue thì các biến cục bộ trong mỗi FrameSummary sẽ được ghi lại dưới dạng biểu diễn đối tượng.

Thay đổi trong phiên bản 3.12: Các ngoại lệ được tạo ra từ repr() trên một biến cục bộ (khi capture_localsTrue) không còn được truyền tới người gọi nữa.

classmethod from_list(a_list)

Xây dựng một đối tượng StackSummary từ danh sách các đối tượng FrameSummary được cung cấp hoặc danh sách các bộ dữ liệu kiểu cũ. Mỗi bộ phải là một bộ gồm 4 bộ với các phần tử là filename, lineno, name, line.

format()

Trả về danh sách các chuỗi sẵn sàng để in. Mỗi chuỗi trong danh sách kết quả tương ứng với một frame duy nhất từ ​​ngăn xếp. Mỗi chuỗi kết thúc bằng một dòng mới; các chuỗi cũng có thể chứa các dòng mới nội bộ đối với những mục có dòng văn bản nguồn.

Đối với các chuỗi dài có cùng khung và dòng, một vài lần lặp lại đầu tiên được hiển thị, theo sau là một dòng tóm tắt cho biết chính xác số lần lặp lại tiếp theo.

Thay đổi trong phiên bản 3.6: Chuỗi dài các khung hình lặp đi lặp lại hiện được viết tắt.

format_frame_summary(frame_summary)

Trả về một chuỗi để in một trong các frames có trong ngăn xếp. Phương thức này được gọi cho mỗi đối tượng FrameSummary được in bởi StackSummary.format(). Nếu nó trả về None, khung hình sẽ bị bỏ qua khỏi đầu ra.

Added in version 3.11.

Đối tượng FrameSummary

Added in version 3.5.

Đối tượng FrameSummary đại diện cho một frame duy nhất trong traceback.

class traceback.FrameSummary(filename, lineno, name, *, lookup_line=True, locals=None, line=None, end_lineno=None, colno=None, end_colno=None)

Đại diện cho một frame duy nhất trong traceback hoặc ngăn xếp đang được định dạng hoặc in. Tùy chọn có thể có một phiên bản được xâu chuỗi của các địa phương của khung được bao gồm trong đó. Nếu lookup_lineFalse, mã nguồn sẽ không được tra cứu cho đến khi FrameSummary có thuộc tính line được truy cập (điều này cũng xảy ra khi truyền nó tới tuple). line có thể được cung cấp trực tiếp và sẽ ngăn chặn việc tra cứu dòng xảy ra. locals là một ánh xạ biến cục bộ tùy chọn và nếu được cung cấp, các biểu diễn biến sẽ được lưu trữ trong bản tóm tắt để hiển thị sau.

Các phiên bản FrameSummary có các thuộc tính sau:

filename

Tên tệp của mã nguồn cho khung này. Tương đương với việc truy cập f.f_code.co_filename trên frame object f.

lineno

Số dòng của mã nguồn cho khung này.

name

Tương đương với việc truy cập f.f_code.co_name trên frame object f.

line

Một chuỗi biểu thị mã nguồn cho khung này, với khoảng trắng ở đầu và cuối được loại bỏ. If the source is not available, it is None.

end_lineno

Số dòng cuối cùng của mã nguồn cho khung này. Theo mặc định, nó được đặt thành lineno và việc lập chỉ mục bắt đầu từ 1.

Thay đổi trong phiên bản 3.13: Giá trị mặc định đã thay đổi từ None thành lineno.

colno

Số cột của mã nguồn cho khung này. Theo mặc định, nó là None và việc lập chỉ mục bắt đầu từ 0.

end_colno

Số cột cuối cùng của mã nguồn cho khung này. Theo mặc định, nó là None và việc lập chỉ mục bắt đầu từ 0.

Ví dụ về việc sử dụng các hàm cấp mô-đun

Ví dụ đơn giản này triển khai một vòng lặp đọc-đánh giá-in cơ bản, tương tự (nhưng ít hữu ích hơn) vòng lặp trình thông dịch tương tác Python tiêu chuẩn. Để triển khai vòng lặp trình thông dịch đầy đủ hơn, hãy tham khảo mô-đun code.

hệ thống nhập khẩu, truy nguyên

chắc chắn run_user_code(envdir):
    nguồn = đầu vào(">>> ")
    thử:
        exec(nguồn, envdir)
    ngoại trừ Ngoại lệ:
        print("Ngoại lệ trong mã người dùng:")
        in("-"*60)
        traceback.print_exc(file=sys.stdout)
        in("-"*60)

envdir = {}
trong khi Đúng:
    run_user_code(envdir)

Ví dụ sau đây minh họa các cách khác nhau để in và định dạng ngoại lệ và truy nguyên:

hệ thống nhập khẩu, truy nguyên

def thợ rừng():
    Bright_side_of_life()

def bright_side_of_life():
    trả về bộ dữ liệu()[0]

thử:
    thợ rừng()
ngoại trừ IndexError dưới dạng exec:
    in ("*** print_tb:")
    traceback.print_tb(exc.__traceback__, limit=1, file=sys.stdout)
    print("*** print_Exception:")
    traceback.print_Exception(exc, limit=2, file=sys.stdout)
    in ("*** print_exc:")
    traceback.print_exc(limit=2, file=sys.stdout)
    print("*** format_exc, dòng đầu tiên và dòng cuối cùng:")
    formatted_lines = traceback.format_exc().splitlines()
    in(formatted_lines[0])
    print(formatted_lines[-1])
    in ("*** định dạng_ngoại lệ:")
    print(repr(traceback.format_Exception(exc)))
    print("*** extract_tb:")
    print(repr(traceback.extract_tb(exc.__traceback__)))
    in ("*** định dạng_tb:")
    print(repr(traceback.format_tb(exc.__traceback__)))
    print("*** tb_lineno:", ex.__traceback__.tb_lineno)

Đầu ra của ví dụ sẽ trông giống như thế này:

*** print_tb:
  Tệp "<doctest...>", dòng 10, trong <module>
    thợ rừng()
    ~~~~~~~~~~ ^^
*** print_Exception:
Traceback (cuộc gọi gần đây nhất):
  Tệp "<doctest...>", dòng 10, trong <module>
    thợ rừng()
    ~~~~~~~~~~ ^^
  Tệp "<doctest...>", dòng 4, trong Lumberjack
    Bright_side_of_life()
    ~~~~~~~~~~~~~~~~~~~~ ^^
IndexError: chỉ mục tuple nằm ngoài phạm vi
*** print_exc:
Traceback (cuộc gọi gần đây nhất):
  Tệp "<doctest...>", dòng 10, trong <module>
    thợ rừng()
    ~~~~~~~~~~ ^^
  Tệp "<doctest...>", dòng 4, trong Lumberjack
    Bright_side_of_life()
    ~~~~~~~~~~~~~~~~~~~~ ^^
IndexError: chỉ mục tuple nằm ngoài phạm vi
*** format_exc, dòng đầu tiên và dòng cuối cùng:
Traceback (cuộc gọi gần đây nhất):
IndexError: chỉ mục tuple nằm ngoài phạm vi
*** định dạng_ngoại lệ:
['Traceback (cuộc gọi gần đây nhất):\n',
 ' Tệp "<doctest default[0]>", dòng 10, trong <module>\n Timberjack()\n ~~~~~~~~~~^^\n',
 ' Tệp "<doctest default[0]>", dòng 4, trong Timberjack\n bright_side_of_life()\n ~~~~~~~~~~~~~~~~~~~^^\n',
 ' Tệp "<doctest default[0]>", dòng 7, trong bright_side_of_life\n return tuple()[0]\n ~~~~~~~^^\n',
 'IndexError: bộ chỉ mục nằm ngoài phạm vi\n']
*** giải nén_tb:
[<Tệp FrameSummary <doctest...>, dòng 10 trong <module>>,
 <Tệp FrameSummary <doctest...>, dòng 4 trong Lumberjack>,
 <Tệp FrameSummary <doctest...>, dòng 7 trong bright_side_of_life>]
*** định dạng_tb:
[' Tệp "<doctest default[0]>", dòng 10, trong <module>\n Timberjack()\n ~~~~~~~~~~^^\n',
 ' Tệp "<doctest default[0]>", dòng 4, trong Timberjack\n bright_side_of_life()\n ~~~~~~~~~~~~~~~~~~~^^\n',
 ' Tệp "<doctest default[0]>", dòng 7, trong bright_side_of_life\n return tuple()[0]\n ~~~~~~~^^\n']
*** tb_lineno: 10

Ví dụ sau đây cho thấy các cách khác nhau để in và định dạng ngăn xếp:

>>> nhập truy nguyên
>>> định nghĩa another_function():
... đống gỗ()
...
>>> def gỗstack():
... traceback.print_stack()
... print(repr(traceback.extract_stack()))
... print(repr(traceback.format_stack()))
...
>>> another_function()
  Tệp "<doctest>", dòng 10, trong <module>
    other_function()
  Tệp "<doctest>", dòng 3, trong another_function
    đống gỗ()
  Tệp "<doctest>", dòng 6, trong Lumberstack
    traceback.print_stack()
[('<doctest>', 10, '<module>', 'another_function()'),
 ('<doctest>', 3, 'another_function', 'lumberstack()'),
 ('<doctest>', 7, 'lumberstack', 'print(repr(traceback.extract_stack()))')]
[' Tệp "<doctest>", dòng 10, trong <module>\n another_function()\n',
 ' Tệp "<doctest>", dòng 3, trong another_function\n Timberstack()\n',
 ' Tệp "<doctest>", dòng 8, trong Timberstack\n print(repr(traceback.format_stack()))\n']

Ví dụ cuối cùng này minh họa một số hàm định dạng cuối cùng:

>>> nhập truy nguyên
>>> traceback.format_list([('spam.py', 3, '<module>', 'spam.eggs()'),
... ('eggs.py', 42, 'trứng', 'trả lại "thịt xông khói"')])
[' Tệp "spam.py", dòng 3, trong <module>\n spam.eggs()\n',
 ' Tệp "Eggs.py", dòng 42, trong trứng\n trả về "thịt xông khói"\n']
>>> an_error = IndexError('chỉ mục bộ dữ liệu nằm ngoài phạm vi')
>>> traceback.format_Exception_only(an_error)
['IndexError: chỉ mục bộ dữ liệu nằm ngoài phạm vi\n']

Ví dụ về việc sử dụng TracebackException

Với lớp trợ giúp, chúng ta có nhiều lựa chọn hơn:

>>> nhập hệ thống
>>> từ nhập truy nguyên TracebackException
>>>
>>> def thợ rừng():
... bright_side_of_life()
...
>>> def bright_side_of_life():
... t = "sáng", "bên", "của", "cuộc sống"
... trả lại t[5]
...
>>> thử:
... thợ rừng()
... ngoại trừ IndexError như e:
...exc = e
...
>>> thử:
... thử:
... thợ rừng()
... ngoại trừ:
... 1/0
... ngoại trừ Ngoại lệ  e:
... chained_exc = e
...
>>> # limit hoạt động giống như các chức năng cấp mô-đun
>>> TracebackException.from_Exception(exc, limit=-2).print()
Traceback (cuộc gọi gần đây nhất):
  Tệp "<python-input-1>", dòng 6, trong thợ rừng
    Bright_side_of_life()
    ~~~~~~~~~~~~~~~~~~~~ ^^
  Tệp "<python-input-1>", dòng 10, trong bright_side_of_life
    trả lại t[5]
           ~^^^
IndexError: chỉ mục tuple nằm ngoài phạm vi

>>> # capture_locals thêm các biến cục bộ vào khung
>>> TracebackException.from_Exception(exc, limit=-2, capture_locals=True).print()
Traceback (cuộc gọi gần đây nhất):
  Tệp "<python-input-1>", dòng 6, trong thợ rừng
    Bright_side_of_life()
    ~~~~~~~~~~~~~~~~~~~~ ^^
  Tệp "<python-input-1>", dòng 10, trong bright_side_of_life
    trả lại t[5]
           ~^^^
    t = ("sáng", "bên", "của", "cuộc sống")
IndexError: chỉ mục tuple nằm ngoài phạm vi

>>> # The *chain* kwarg to print() kiểm soát xem có bị xích hay không
>>> # exceptions được hiển thị
>>> TracebackException.from_Exception(chained_exc).print()
Traceback (cuộc gọi gần đây nhất):
  Tệp "<python-input-19>", dòng 4, trong <module>
    thợ rừng()
    ~~~~~~~~~~ ^^
  Tệp "<python-input-8>", dòng 7, trong thợ rừng
    Bright_side_of_life()
    ~~~~~~~~~~~~~~~~~~~~ ^^
  Tệp "<python-input-8>", dòng 11, trong bright_side_of_life
    trả lại t[5]
           ~^^^
IndexError: chỉ mục tuple nằm ngoài phạm vi

Trong quá trình xử lý ngoại lệ trên, một ngoại lệ khác đã xảy ra:

Traceback (cuộc gọi gần đây nhất):
  Tệp "<python-input-19>", dòng 6, trong <module>
    1/0
    ~^~
ZeroDivisionError: chia cho 0

>>> TracebackException.from_Exception(chained_exc).print(chain=False)
Traceback (cuộc gọi gần đây nhất):
  Tệp "<python-input-19>", dòng 6, trong <module>
    1/0
    ~^~
ZeroDivisionError: chia cho 0