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
TracebackExceptionvà các lớp trợ giúp của nóStackSummaryvàFrameSummary. 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ặcNone, tất cả các mục sẽ được in. Nếu file bị bỏ qua hoặcNone, đầu ra sẽ chuyển sangsys.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ủasys.tracebacklimit, trong khi hành vi của giá trị limit dương không thể đạt được vớisys.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) là
SyntaxErrorvà value 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 value và tb, một đối tượng ngoại lệ có thể được truyền làm đối số đầu tiên. Nếu value và tb đượ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 (xemsys.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ặcNone, 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ớiprint_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ớiprint_tb(). Mục nhập dấu vết ngăn xếp "được xử lý trước" là đối tượngFrameSummarychứa các thuộc tínhfilename,lineno,namevàlinethể 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ố f và limit tùy chọn có ý nghĩa tương tự như đối vớiprint_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ặcextract_stack()dưới dạng dấu vết ngăn xếp được định dạng cho tệp đã cho. Nếu file làNone, đầu ra được ghi vàosys.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ởiextract_tb()hoặcextract_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ứanotescủ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_group là
Truevà ngoại lệ là một phiên bản củaBaseExceptionGroup, 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_backtừ khung nhất định, mang lại khung và số dòng cho mỗi khung. Nếu f làNonethì 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ớiStackSummary.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_nextyielding the frame and line number for each frame. Trình trợ giúp này được sử dụng vớiStackSummary.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 traceback và frame. 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_lines và capture_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ủaTracebackExceptionmới được lưu trong thuộc tính lớp. Đặc biệt, trường__context__chỉ được tính nếu__cause__làNonevà__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_width và max_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_width và max_group_depth.
- __context__¶
Một
TracebackExceptioncủa__context__ban đầu.
- exceptions¶
Nếu
selfđại diện choExceptionGroup, trường này chứa danh sách các phiên bảnTracebackExceptionđạ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ặcNonenếu ngoại lệ không có bất kỳ ghi chú nào. Nếu nó không phải làNonethì 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à
Nonenế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à
Nonenế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_lines và capture_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.stderrmặc định) thông tin ngoại lệ được trả về bởiformat().Added in version 3.11.
- format(*, chain=True)¶
Định dạng ngoại lệ.
Nếu chain không phải là
Truethì__cause__và__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_group là
False, 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_group là
Truevà ngoại lệ là một phiên bản củaBaseExceptionGroup, 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:
notescủ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
StackSummarytừ trình tạo khung (chẳng hạn như được trả về bởiwalk_stack()hoặcwalk_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_lines là
False, các đối tượngFrameSummaryđược trả về sẽ chưa đọc dòng của chúng, khiến chi phí tạoStackSummaryrẻ hơn (có thể có giá trị nếu nó không thực sự được định dạng). Nếu capture_locals làTruethì các biến cục bộ trong mỗiFrameSummarysẽ đượ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_locals làTrue) 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
StackSummarytừ danh sách các đối tượngFrameSummaryđượ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ởiStackSummary.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_line là
False, mã nguồn sẽ không được tra cứu cho đến khiFrameSummarycó thuộc tínhlineđược truy cập (điều này cũng xảy ra khi truyền nó tớituple).linecó 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
FrameSummarycó 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_filenametrê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_nametrê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
linenovà 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ừ
Nonethànhlineno.
- colno¶
Số cột của mã nguồn cho khung này. Theo mặc định, nó là
Nonevà 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à
Nonevà 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ệ 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