traceback --- چاپ یا بازیابی ردگیری پشته¶
کد منبع: Lib/traceback.py
این ماژول یک رابط استاندارد برای استخراج، قالببندی و چاپ ردگیریهای پشته برنامههای پایتون فراهم میکند. این ماژول از نمایش پیشفرض ردگیری پشته در مفسر انعطافپذیرتر است و بنابراین پیکربندی برخی جنبههای خروجی را ممکن میسازد. در نهایت، این ماژول شامل ابزاری برای گرفتن اطلاعات کافی درباره یک استثنا جهت چاپ آن در زمان بعدی است، بدون اینکه نیازی به ذخیره کردن ارجاع به خود استثنا باشد. از آنجا که استثناها میتوانند ریشههای گراف بزرگی از اشیاء باشند، این ابزار میتواند مدیریت حافظه را بهطور قابلتوجهی بهبود بخشد.
این ماژول از اشیای ردگیری پشته استفاده میکند — اینها اشیایی از نوع types.TracebackType هستند که به فیلد __traceback__ در نمونههای BaseException اختصاص داده میشوند.
همچنین ملاحظه نمائید
- ماژول
faulthandler برای برونریزی صریح ردگیریهای پشته پایتون، در صورت بروز خطا، پس از پایان مهلت، یا با دریافت سیگنال کاربر استفاده میشود.
- ماژول
pdb اشکالزدای تعاملی کد منبع برای برنامههای پایتون.
API ماژول را میتوان به دو بخش تقسیم کرد:
توابع سطح ماژول که عملکرد پایهای ارائه میدهند، برای بررسی تعاملی استثناها و ردگیریهای پشته مفید هستند.
کلاس
TracebackExceptionو کلاسهای کمکی آنStackSummaryوFrameSummary. این کلاسها هم انعطافپذیری بیشتر در خروجی تولیدشده و هم توانایی ذخیرهی اطلاعات لازم برای قالببندی بعدی را بدون نگهداشتن ارجاع به اشیاء واقعی استثنا و ردگیری پشته ارائه میدهند.
اضافه شده در نسخهی 3.13: خروجی بهطور پیشفرض رنگی است و میتوان آن را با استفاده از متغیرهای محیطی کنترل کرد.
توابع سطح ماژول¶
- traceback.print_tb(tb, limit=None, file=None)¶
اگر limit مثبت باشد، حداکثر limit ورودی از ردگیری پشته را از شیء ردگیری پشته tb (با شروع از فریم فراخواننده) چاپ میکند. در غیر این صورت، آخرین
abs(limit)ورودی را چاپ میکند. اگر limit حذفشده باشد یاNoneباشد، تمام ورودیها چاپ میشوند. اگر file حذفشده باشد یاNoneباشد، خروجی بهsys.stderrارسال میشود؛ در غیر این صورت، باید یک پرونده باز یا file-like object باشد که خروجی را دریافت کند.توجه
معنای پارامتر limit با معنای
sys.tracebacklimitمتفاوت است. مقدار منفی limit متناظر با یک مقدار مثبت ازsys.tracebacklimitاست، در حالی که نمیتوان رفتار یک مقدار مثبت limit را باsys.tracebacklimitبه دست آورد.تغییر یافته در نسخهی 3.5: پشتیبانی از limit منفی افزوده شد.
- traceback.print_exception(exc, /, [value, tb, ]limit=None, file=None, chain=True)¶
اطلاعات استثنا و ورودیهای ردگیری پشته را از شیء ردگیری پشته tb در file چاپ میکند. این در موارد زیر با
print_tb()تفاوت دارد:اگر tb
Noneنباشد، سرآیندTraceback (most recent call last):را چاپ میکندنوع استثنا و مقدار را پس از ردگیری پشته چاپ میکند
اگر type(value)
SyntaxErrorباشد و value قالب مناسبی داشته باشد، سطری را که خطای نحوی در آن رخ داده است، همراه با یک نشانک که موقعیت تقریبی خطا را نشان میدهد، چاپ میکند.
از پایتون 3.10 به بعد، به جای ارسال value و tb، میتوان یک شیء استثنا را بهعنوان اولین آرگومان ارسال کرد. اگر value و tb ارائه شوند، اولین آرگومان نادیده گرفته میشود تا سازگاری با نسخههای پیشین فراهم شود.
آرگومان اختیاری limit همان معنای مورد استفاده در
print_tb()را دارد. اگر chain درست باشد (پیشفرض)، استثناهای زنجیرهای (ویژگیهای__cause__یا__context__استثنا) نیز چاپ خواهند شد، همانگونه که خود مفسر هنگام چاپ یک استثنای مدیریتنشده عمل میکند.تغییر یافته در نسخهی 3.5: آرگومان etype نادیده گرفته میشود و از روی نوع value استنتاج میشود.
تغییر یافته در نسخهی 3.10: پارامتر etype به exc تغییر نام یافته است و اکنون فقط جایگاهی است.
- traceback.print_exc(limit=None, file=None, chain=True)¶
این میانبری برای
print_exception(sys.exception(), limit=limit, file=file, chain=chain)است.
- traceback.print_last(limit=None, file=None, chain=True)¶
این شکل کوتاهشدهای از
print_exception(sys.last_exc, limit=limit, file=file, chain=chain)است. بهطور کلی، این فقط پس از آن کار خواهد کرد که یک استثنا به اعلان تعاملی رسیده باشد (بهsys.last_excمراجعه کنید).
- traceback.print_stack(f=None, limit=None, file=None)¶
اگر limit مثبت باشد، حداکثر limit ورودی ردگیری پشته (شروع از نقطه فراخوانی) چاپ میشود. در غیر این صورت، آخرین
abs(limit)ورودی چاپ میشود. اگر limit حذف شده باشد یاNoneباشد، همه ورودیها چاپ میشوند. میتوان از آرگومان اختیاری f برای مشخص کردن یک فریم پشته جایگزین برای شروع استفاده کرد. آرگومان اختیاری file همان معنایی را دارد که درprint_tb()دارد.تغییر یافته در نسخهی 3.5: پشتیبانی از limit منفی افزوده شد.
- traceback.extract_tb(tb, limit=None)¶
یک شیء
StackSummaryبازمیگرداند که نشاندهندهی فهرستی از آیتمهای «پیشپردازششده» ردگیری پشته است که از شیء ردگیری tb استخراج شدهاند. این شیء برای قالببندی جایگزین ردگیریهای پشته مفید است. آرگومان اختیاری limit همان معنای مورد استفاده درprint_tb()را دارد. یک آیتم «پیشپردازششده» ردگیری پشته، یک شیءFrameSummaryبا ویژگیهایی است که نشاندهندهی اطلاعاتی هستند که معمولاً برای یک ردگیری پشته چاپ میشود.
- traceback.extract_stack(f=None, limit=None)¶
ردگیری پشتهی خام را از فریم پشته فعلی استخراج کنید. مقدار بازگشتی همان قالب
extract_tb()را دارد. آرگومانهای اختیاری f و limit همان معنایی را دارند که درprint_stack()دارند.
- traceback.print_list(extracted_list, file=None)¶
فهرستی از تاپلها را که توسط
extract_tb()یاextract_stack()برگردانده شده است، بهصورت یک ردگیری پشته قالببندیشده در پرونده دادهشده چاپ میکند. اگر file برابرNoneباشد، خروجی درsys.stderrنوشته میشود.
- traceback.format_list(extracted_list)¶
با دریافت فهرستی از تاپلها یا اشیای
FrameSummaryکه توسطextract_tb()یاextract_stack()بازگردانده شده است، فهرستی از رشتهها را که برای چاپ آماده هستند، برمیگرداند. هر رشته در فهرست حاصل، با آیتم دارای همان اندیس در فهرست آرگومان متناظر است. هر رشته با یک خط جدید پایان مییابد؛ برای آن آیتمهایی که خط متن منبع آنهاNoneنیست، رشتهها ممکن است حاوی سطرهای جدید داخلی نیز باشند.
- traceback.format_exception_only(exc, /, [value, ]*, show_group=False)¶
بخش استثنای یک ردگیری پشته را با استفاده از یک مقدار استثنا، مانند آنچه توسط
sys.last_excداده میشود، قالببندی کنید. مقدار بازگشتی، فهرستی از رشتهها است که هر یک به یک خط جدید ختم میشود. این فهرست شامل پیام استثنا است که معمولاً یک رشته واحد است؛ با این حال، برای استثناهایSyntaxError، این فهرست شامل چندین خط است که (هنگام چاپ) اطلاعات دقیقی در مورد محل وقوع خطای سینتکسی نمایش میدهند. پس از پیام، فهرست شامل یادداشتهای استثنا (notes) است.از پایتون 3.10، به جای ارسال value، میتوان یک شیء استثنا را بهعنوان اولین آرگومان ارسال کرد. اگر value ارائه شود، اولین آرگومان برای فراهم کردن سازگاری با نسخههای پیشین نادیده گرفته میشود.
هنگامی که show_group برابر
Trueباشد و استثنا نمونهای ازBaseExceptionGroupباشد، استثناهای تودرتو نیز بهصورت بازگشتی، با تورفتگی متناسب با عمق تودرتوی آنها، گنجانده میشوند.تغییر یافته در نسخهی 3.10: پارامتر etype به exc تغییر نام یافته است و اکنون فقط جایگاهی است.
تغییر یافته در نسخهی 3.11: فهرست برگرداندهشده اکنون شامل هرگونه
notesپیوستشده به استثنا میشود.تغییر یافته در نسخهی 3.13: پارامتر show_group افزوده شد.
- traceback.format_exception(exc, /, [value, tb, ]limit=None, chain=True)¶
ردگیری پشته و اطلاعات استثنا را قالببندی میکند. آرگومانها همان معنای آرگومانهای متناظر در
print_exception()را دارند. مقدار بازگشتی فهرستی از رشتهها است که هر یک با یک خط جدید پایان مییابد و برخی از آنها شامل سطرهای جدید داخلی هستند. هنگامی که این سطرها به هم پیوسته و چاپ شوند، دقیقاً همان متنی چاپ میشود کهprint_exception()چاپ میکند.تغییر یافته در نسخهی 3.5: آرگومان etype نادیده گرفته میشود و از روی نوع value استنتاج میشود.
تغییر یافته در نسخهی 3.10: رفتار و امضای این تابع برای مطابقت با
print_exception()تغییر کردهاند.
- traceback.format_exc(limit=None, chain=True)¶
این مانند
print_exc(limit)است، اما بهجای چاپ در یک پرونده، یک رشته را برمیگرداند.
- traceback.format_tb(tb, limit=None)¶
میانبری برای
format_list(extract_tb(tb, limit)).
- traceback.format_stack(f=None, limit=None)¶
میانبری برای
format_list(extract_stack(f, limit)).
- traceback.clear_frames(tb)¶
با فراخوانی متد
clear()هر شیء فریم، متغیرهای محلی تمام فریمهای پشته در ردگیری پشته tb را پاک میکند.اضافه شده در نسخهی 3.4.
- traceback.walk_stack(f)¶
پشتهای را با دنبال کردن
f.f_backاز فریم دادهشده میپیماید و فریم و شمارهی خط هر فریم را تولید میکند. اگر f برابرNoneباشد، از پشتهی جاری استفاده میشود. این تابع کمکی همراه باStackSummary.extract()استفاده میشود.اضافه شده در نسخهی 3.5.
تغییر یافته در نسخهی 3.14: این تابع پیشتر تولیدگری را برمیگرداند که در نخستین تکرار، پشته را میپیمود. تولیدگر برگرداندهشده در حال حاضر، وضعیت پشته در زمان فراخوانی
walk_stackاست.
- traceback.walk_tb(tb)¶
یک ردگیری پشته را با دنبال کردن
tb_nextپیمایش میکند و برای هر فریم، فریم و شماره خط آن را تولید میکند. این تابع کمکی به همراهStackSummary.extract()استفاده میشود.اضافه شده در نسخهی 3.5.
اشیای TracebackException¶
اضافه شده در نسخهی 3.5.
اشیای TracebackException از استثناهای واقعی ایجاد میشوند تا دادهها را برای چاپ در زمان بعدی ثبت کنند. آنها با پرهیز از نگهداشتن ارجاع به اشیای traceback و frame، روش سبکتری برای ذخیرهسازی این اطلاعات ارائه میدهند. علاوه بر این، در مقایسه با توابع سطح ماژول توصیفشده در بالا، گزینههای بیشتری برای پیکربندی خروجی در اختیار میگذارند.
- 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)¶
یک استثنا را برای نمایش بعدی ضبط کنید. معنای limit، lookup_lines و capture_locals همانند کلاس
StackSummaryاست.اگر compact درست باشد، فقط دادههای مورد نیاز متد
format()ازTracebackExceptionدر ویژگیهای کلاس ذخیره میشوند. بهویژه، فیلد__context__تنها زمانی محاسبه میشود که__cause__برابرNoneباشد و__suppress_context__نادرست باشد.توجه داشته باشید که هنگامی که متغیرهای محلی ثبت میشوند، آنها نیز در ردگیری پشته نمایش داده میشوند.
max_group_width و max_group_depth قالببندی گروههای استثنا را کنترل میکنند (به
BaseExceptionGroupمراجعه کنید). عمق به سطح تودرتویی گروه اشاره دارد و عرض به اندازهی آرایهی exceptions یک گروه استثنای واحد اشاره دارد. هرگاه از یکی از این محدودیتها فراتر رود، خروجی قالببندیشده بریده میشود.تغییر یافته در نسخهی 3.10: پارامتر compact افزوده شد.
تغییر یافته در نسخهی 3.11: پارامترهای max_group_width و max_group_depth افزوده شدند.
- __context__¶
یک
TracebackExceptionاز__context__اصلی.
- exceptions¶
اگر
selfنمایانگر یکExceptionGroupباشد، این فیلد شامل فهرستی از نمونههایTracebackExceptionاست که استثناهای تودرتو را نشان میدهند. در غیر این صورت،Noneاست.اضافه شده در نسخهی 3.11.
- __suppress_context__¶
مقدار
__suppress_context__از استثنای اصلی.
- __notes__¶
مقدار
__notes__از استثنای اصلی، یاNoneاگر استثنا هیچ یادداشتی نداشته باشد. اگرNoneنباشد، در ردگیری پشته پس از رشتهی استثنا قالببندی میشود.اضافه شده در نسخهی 3.11.
- stack¶
یک
StackSummaryکه ردگیری پشته را نشان میدهد.
- exc_type¶
کلاس استثنای اصلی.
منسوخ شده از نسخهی 3.13.
- exc_type_str¶
نمایش رشتهای کلاس استثنای اصلی.
اضافه شده در نسخهی 3.13.
- filename¶
برای خطاهای سینتکسی - نام پروندهای که خطا در آن رخ داده است.
- lineno¶
برای خطاهای سینتکسی - شمارهی سطری که خطا در آن رخ داده است.
- end_lineno¶
برای خطاهای نحوی - شماره خط پایانی که خطا در آن رخ داده است. اگر موجود نباشد، میتواند
Noneباشد.اضافه شده در نسخهی 3.10.
- text¶
برای خطاهای سینتکسی — متنی که خطا در آن رخ داده است.
- offset¶
برای خطاهای نحوی - آفست در متنی که خطا در آن رخ داده است.
- end_offset¶
برای خطاهای سینتکسی - آفست انتهایی در متنی که خطا در آن رخ داده است. اگر موجود نباشد، میتواند
Noneباشد.اضافه شده در نسخهی 3.10.
- msg¶
برای خطاهای سینتکسی - پیام خطای کامپایلر.
- classmethod from_exception(exc, *, limit=None, lookup_lines=True, capture_locals=False, compact=False, max_group_width=15, max_group_depth=10)¶
یک استثنا را برای نمایش (rendering) بعدی ثبت میکند. limit، lookup_lines و capture_locals همانند کلاس
StackSummaryهستند.توجه داشته باشید که هنگامی که متغیرهای محلی ثبت میشوند، آنها نیز در ردگیری پشته نمایش داده میشوند.
- print(*, file=None, chain=True)¶
اطلاعات استثنا برگرداندهشده توسط
format()را در file (پیشفرضsys.stderr) چاپ میکند.اضافه شده در نسخهی 3.11.
- format(*, chain=True)¶
استثنا را قالببندی کنید.
اگر chain برابر
Trueنباشد،__cause__و__context__قالببندی نمیشوند.مقدار بازگشتی یک تولیدگر از رشتهها است، که هر یک به یک خط جدید ختم میشوند و برخی دارای سطرهای جدید داخلی هستند.
print_exception()پوششی بر این متد است که فقط سطرها را در یک پرونده چاپ میکند.
- format_exception_only(*, show_group=False)¶
بخش استثنا از ردگیری پشته را قالببندی کنید.
مقدار بازگشتی، تولیدگری از رشتهها است که هر یک به یک خط جدید ختم میشوند.
هنگامی که show_group برابر
Falseباشد، تولیدگر پیام استثنا و سپس یادداشتهای آن (در صورت وجود) را خروجی میدهد. پیام استثنا معمولاً یک رشته واحد است؛ با این حال، در مورد استثناهایSyntaxError، از چندین خط تشکیل شده است که (هنگام چاپ) اطلاعات دقیقی دربارهی محل وقوع خطای سینتکس نمایش میدهند.هنگامی که show_group برابر
Trueباشد و استثنا نمونهای ازBaseExceptionGroupباشد، استثناهای تودرتو نیز بهصورت بازگشتی، با تورفتگی متناسب با عمق تودرتوی آنها، گنجانده میشوند.تغییر یافته در نسخهی 3.11: اکنون
notesمربوط به استثنا در خروجی گنجانده شدهاند.تغییر یافته در نسخهی 3.13: پارامتر show_group اضافه شد.
اشیای StackSummary¶
اضافه شده در نسخهی 3.5.
اشیای StackSummary بیانگر یک پشته فراخوانی آماده برای قالببندی هستند.
- class traceback.StackSummary¶
- classmethod extract(frame_gen, *, limit=None, lookup_lines=True, capture_locals=False)¶
یک شیء
StackSummaryرا از یک تولیدگر فریم بسازید (مانند آنچه توسطwalk_stack()یاwalk_tb()بازگردانده میشود).اگر limit ارائه شود، تنها همین تعداد فریم از frame_gen گرفته میشود. اگر lookup_lines برابر
Falseباشد، اشیایFrameSummaryبرگرداندهشده هنوز سطرهای خود را نخواندهاند؛ این امر هزینهی ایجادStackSummaryرا کمتر میکند (که اگر ممکن است خود آن واقعاً قالببندی نشود، ممکن است ارزشمند باشد). اگر capture_locals برابرTrueباشد، متغیرهای محلی در هرFrameSummaryبهصورت بازنماییهای شیء گرفته میشوند.تغییر یافته در نسخهی 3.12: استثناهای پرتابشده از
repr()روی یک متغیر محلی (هنگامی که capture_locals برابرTrueاست) دیگر به فراخواننده منتقل نمیشوند.
- classmethod from_list(a_list)¶
یک شیء
StackSummaryرا از یک فهرست ارائهشده از اشیایFrameSummaryیا فهرستی از تاپلها بهسبک قدیمی بسازید. هر تاپل باید یک تاپل با ۴ عضو باشد که عناصر آن filename، lineno، name و line هستند.
- format()¶
فهرستی از رشتهها را برمیگرداند که آماده برای چاپ هستند. هر رشته در فهرست حاصل، متناظر با یک فریم از پشته است. هر رشته به یک نویسهی خط جدید ختم میشود؛ همچنین ممکن است رشتهها شامل نویسههای خط جدید داخلی نیز باشند، برای آن آیتمهایی که دارای سطرهای متن منبع هستند.
برای دنبالههای طولانی از یک فریم و خط یکسان، چند تکرار نخست نمایش داده میشوند و پس از آنها یک خط خلاصه میآید که تعداد دقیق تکرارهای بعدی را بیان میکند.
تغییر یافته در نسخهی 3.6: دنبالههای طولانی از فریمهای تکراری اکنون خلاصه میشوند.
- format_frame_summary(frame_summary)¶
رشتهای برای چاپ یکی از فریمهای درگیر در پشته برمیگرداند. این متد برای هر شیء
FrameSummaryکه قرار است توسطStackSummary.format()چاپ شود، فراخوانی میشود. اگرNoneرا برگرداند، آن فریم از خروجی حذف میشود.اضافه شده در نسخهی 3.11.
اشیاء FrameSummary¶
اضافه شده در نسخهی 3.5.
یک شیء FrameSummary نشاندهندهی یک فریم در یک ردگیری است.
- class traceback.FrameSummary(filename, lineno, name, *, lookup_line=True, locals=None, line=None, end_lineno=None, colno=None, end_colno=None)¶
نمایانگر یک فریم واحد در ردگیری پشته یا پشتهای است که در حال قالببندی یا چاپ است. ممکن است بهصورت اختیاری یک نسخهی رشتهایشده از متغیرهای محلی فریم در آن گنجانده شده باشد. اگر lookup_line برابر
Falseباشد، تا زمانی که به ویژگیlineشیءFrameSummaryدسترسی پیدا نشود، کد منبع جستجو نمیشود (که این اتفاق هنگام تبدیل آن به یکtupleنیز رخ میدهد). میتوانlineرا مستقیماً ارائه کرد، که این کار بهطور کلی از جستجوی خط جلوگیری میکند. locals یک نگاشت اختیاری از متغیرهای محلی است، و در صورت ارائه، بازنماییهای متغیرها برای نمایش بعدی در خلاصه ذخیره میشوند.نمونههای
FrameSummaryدارای ویژگیهای زیر هستند:- filename¶
نام پرونده کد منبع برای این فریم. معادل دسترسی به
f.f_code.co_filenameدر یک شیء فریم f است.
- lineno¶
شمارهی خط کد منبع برای این فریم .
- name¶
معادل با دسترسی به
f.f_code.co_nameروی یک شیء فریم f.
- line¶
رشتهای که کد منبع این فریم را نشان میدهد، که فضای سفید ابتدا و انتهای آن حذف شده است. اگر کد منبع در دسترس نباشد، مقدار آن
Noneاست.
- end_lineno¶
آخرین شماره خط کد منبع این فریم. بهطور پیشفرض، این مقدار روی
linenoتنظیم میشود و اندیسگذاری از ۱ آغاز میشود.تغییر یافته در نسخهی 3.13: مقدار پیشفرض از
Noneبهlinenoتغییر کرد.
- colno¶
شمارهی ستون کد منبع این فریم. بهطور پیشفرض، مقدار آن
Noneاست و اندیسگذاری از ۰ شروع میشود.
- end_colno¶
آخرین شماره ستون کد منبع برای این فریم. بهطور پیشفرض، این مقدار
Noneاست و اندیسگذاری از ۰ شروع میشود.
نمونههایی از استفاده از توابع سطح ماژول¶
این مثال ساده یک حلقه خواندن-ارزیابی-چاپ (read-eval-print loop) پایه را پیادهسازی میکند، شبیه به (اما کمتر مفید از) حلقه مفسر تعاملی استاندارد پایتون. برای پیادهسازی کاملتر حلقه مفسر، به ماژول code مراجعه کنید.
import sys, traceback
def run_user_code(envdir):
source = input(">>> ")
try:
exec(source, envdir)
except Exception:
print("Exception in user code:")
print("-"*60)
traceback.print_exc(file=sys.stdout)
print("-"*60)
envdir = {}
while True:
run_user_code(envdir)
مثال زیر روشهای مختلف برای چاپ و قالببندی استثنا و ردگیری را نشان میدهد:
import sys, traceback
def lumberjack():
bright_side_of_life()
def bright_side_of_life():
return tuple()[0]
try:
lumberjack()
except IndexError as exc:
print("*** print_tb:")
traceback.print_tb(exc.__traceback__, limit=1, file=sys.stdout)
print("*** print_exception:")
traceback.print_exception(exc, limit=2, file=sys.stdout)
print("*** print_exc:")
traceback.print_exc(limit=2, file=sys.stdout)
print("*** format_exc, first and last line:")
formatted_lines = traceback.format_exc().splitlines()
print(formatted_lines[0])
print(formatted_lines[-1])
print("*** format_exception:")
print(repr(traceback.format_exception(exc)))
print("*** extract_tb:")
print(repr(traceback.extract_tb(exc.__traceback__)))
print("*** format_tb:")
print(repr(traceback.format_tb(exc.__traceback__)))
print("*** tb_lineno:", exc.__traceback__.tb_lineno)
خروجی این مثال به چیزی شبیه به این خواهد بود:
*** print_tb:
File "<doctest...>", line 10, in <module>
lumberjack()
~~~~~~~~~~^^
*** print_exception:
Traceback (most recent call last):
File "<doctest...>", line 10, in <module>
lumberjack()
~~~~~~~~~~^^
File "<doctest...>", line 4, in lumberjack
bright_side_of_life()
~~~~~~~~~~~~~~~~~~~^^
IndexError: tuple index out of range
*** print_exc:
Traceback (most recent call last):
File "<doctest...>", line 10, in <module>
lumberjack()
~~~~~~~~~~^^
File "<doctest...>", line 4, in lumberjack
bright_side_of_life()
~~~~~~~~~~~~~~~~~~~^^
IndexError: tuple index out of range
*** format_exc, first and last line:
Traceback (most recent call last):
IndexError: tuple index out of range
*** format_exception:
['Traceback (most recent call last):\n',
' File "<doctest default[0]>", line 10, in <module>\n lumberjack()\n ~~~~~~~~~~^^\n',
' File "<doctest default[0]>", line 4, in lumberjack\n bright_side_of_life()\n ~~~~~~~~~~~~~~~~~~~^^\n',
' File "<doctest default[0]>", line 7, in bright_side_of_life\n return tuple()[0]\n ~~~~~~~^^^\n',
'IndexError: tuple index out of range\n']
*** extract_tb:
[<FrameSummary file <doctest...>, line 10 in <module>>,
<FrameSummary file <doctest...>, line 4 in lumberjack>,
<FrameSummary file <doctest...>, line 7 in bright_side_of_life>]
*** format_tb:
[' File "<doctest default[0]>", line 10, in <module>\n lumberjack()\n ~~~~~~~~~~^^\n',
' File "<doctest default[0]>", line 4, in lumberjack\n bright_side_of_life()\n ~~~~~~~~~~~~~~~~~~~^^\n',
' File "<doctest default[0]>", line 7, in bright_side_of_life\n return tuple()[0]\n ~~~~~~~^^^\n']
*** tb_lineno: 10
مثال زیر روشهای مختلف چاپ و قالببندی ردگیری پشته را نشان میدهد:
>>> import traceback
>>> def another_function():
... lumberstack()
...
>>> def lumberstack():
... traceback.print_stack()
... print(repr(traceback.extract_stack()))
... print(repr(traceback.format_stack()))
...
>>> another_function()
File "<doctest>", line 10, in <module>
another_function()
File "<doctest>", line 3, in another_function
lumberstack()
File "<doctest>", line 6, in lumberstack
traceback.print_stack()
[('<doctest>', 10, '<module>', 'another_function()'),
('<doctest>', 3, 'another_function', 'lumberstack()'),
('<doctest>', 7, 'lumberstack', 'print(repr(traceback.extract_stack()))')]
[' File "<doctest>", line 10, in <module>\n another_function()\n',
' File "<doctest>", line 3, in another_function\n lumberstack()\n',
' File "<doctest>", line 8, in lumberstack\n print(repr(traceback.format_stack()))\n']
این آخرین مثال، چند تابع قالببندی پایانی را نشان میدهد:
>>> import traceback
>>> traceback.format_list([('spam.py', 3, '<module>', 'spam.eggs()'),
... ('eggs.py', 42, 'eggs', 'return "bacon"')])
[' File "spam.py", line 3, in <module>\n spam.eggs()\n',
' File "eggs.py", line 42, in eggs\n return "bacon"\n']
>>> an_error = IndexError('tuple index out of range')
>>> traceback.format_exception_only(an_error)
['IndexError: tuple index out of range\n']
نمونههایی از استفاده از TracebackException¶
با کلاس کمکی، گزینههای بیشتری در اختیار داریم:
>>> import sys
>>> from traceback import TracebackException
>>>
>>> def lumberjack():
... bright_side_of_life()
...
>>> def bright_side_of_life():
... t = "bright", "side", "of", "life"
... return t[5]
...
>>> try:
... lumberjack()
... except IndexError as e:
... exc = e
...
>>> try:
... try:
... lumberjack()
... except:
... 1/0
... except Exception as e:
... chained_exc = e
...
>>> # limit works as with the module-level functions
>>> TracebackException.from_exception(exc, limit=-2).print()
Traceback (most recent call last):
File "<python-input-1>", line 6, in lumberjack
bright_side_of_life()
~~~~~~~~~~~~~~~~~~~^^
File "<python-input-1>", line 10, in bright_side_of_life
return t[5]
~^^^
IndexError: tuple index out of range
>>> # capture_locals adds local variables in frames
>>> TracebackException.from_exception(exc, limit=-2, capture_locals=True).print()
Traceback (most recent call last):
File "<python-input-1>", line 6, in lumberjack
bright_side_of_life()
~~~~~~~~~~~~~~~~~~~^^
File "<python-input-1>", line 10, in bright_side_of_life
return t[5]
~^^^
t = ("bright", "side", "of", "life")
IndexError: tuple index out of range
>>> # The *chain* kwarg to print() controls whether chained
>>> # exceptions are displayed
>>> TracebackException.from_exception(chained_exc).print()
Traceback (most recent call last):
File "<python-input-19>", line 4, in <module>
lumberjack()
~~~~~~~~~~^^
File "<python-input-8>", line 7, in lumberjack
bright_side_of_life()
~~~~~~~~~~~~~~~~~~~^^
File "<python-input-8>", line 11, in bright_side_of_life
return t[5]
~^^^
IndexError: tuple index out of range
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<python-input-19>", line 6, in <module>
1/0
~^~
ZeroDivisionError: division by zero
>>> TracebackException.from_exception(chained_exc).print(chain=False)
Traceback (most recent call last):
File "<python-input-19>", line 6, in <module>
1/0
~^~
ZeroDivisionError: division by zero