كيفية الخروج من بيثون دون trureback؟
سؤال
أود أن أعرف كيف يمكنني الخروج من بيثون دون وجود تفريغ Traceback على الإخراج.
ما زلت أريد أريد أن أكون قادرا على إرجاع رمز الخطأ لكنني لا أريد عرض سجل Traceback.
أريد أن أكون قادرا على الخروج باستخدام exit(number)
دون تتبع ولكن في حالة استثناء (وليس خروج) أريد التتبع.
المحلول
من المفترض أن تواجه استثناء ويتم إخراج البرنامج بسبب هذا (مع Traceback). أول شيء يجب القيام به هو التقاط هذا الاستثناء، قبل الخروج بشكل نظيف (ربما مع رسالة، مثال معين).
جرب شيئا مثل هذا في main
نمط:
import sys, traceback
def main():
try:
do main program stuff here
....
except KeyboardInterrupt:
print "Shutdown requested...exiting"
except Exception:
traceback.print_exc(file=sys.stdout)
sys.exit(0)
if __name__ == "__main__":
main()
نصائح أخرى
ربما كنت تحاول التقاط جميع الاستثناءات وهذا هو اللحاق SystemExit
استثناء أثاره sys.exit()
?
import sys
try:
sys.exit(1) # Or something that calls sys.exit()
except SystemExit as e:
sys.exit(e)
except:
# Cleanup and reraise. This will print a backtrace.
# (Insert your cleanup code here.)
raise
بشكل عام، باستخدام except:
بدون تسمية استثناء هو فكرة سيئة. سوف تلتقط جميع أنواع الأشياء التي لا ترغب في اللحاق بها SystemExit
- ويمكن أن يخفي أيضا أخطاء البرمجة الخاصة بك. مثالتي أعلاه سخيفة، إلا إذا كنت تفعل شيئا من حيث التنظيف. يمكنك استبدالها مع:
import sys
sys.exit(1) # Or something that calls sys.exit().
إذا كنت بحاجة للخروج دون رفع SystemExit
:
import os
os._exit(1)
أقوم بذلك، في التعليمات البرمجية التي تعمل تحت التغريد والمكالمات fork()
. وبعد تحصل على التغلب عندما تثير العملية المترتبة SystemExit
. وبعد هذه هي بالتأكيد حالة الزاوية!
import sys
sys.exit(1)
شيء مثل import sys; sys.exit(0)
?
لن يثير التعليمات البرمجية التالية استثناء وسوف يخرج بدون Traceback:
import os
os._exit(1)
انظر هذا السؤال والإجابات ذات الصلة لمزيد من التفاصيل. فاجأ لماذا جميع الإجابات الأخرى غير معقلة للغاية.
من الأفضل كثيرا تجنب استخدام SYS.EXIT () وبدلا من ذلك رفع / معالجة الاستثناءات للسماح للبرنامج بالانتهاء بشكل نظيف. إذا كنت ترغب في إيقاف تشغيل Traceback، فما عليك سوى استخدام:
sys.trackbacklimit=0
يمكنك تعيين هذا في الجزء العلوي من البرنامج النصي الخاص بك إلى الاسكواش جميع إخراج Traceback، لكنني أفضل استخدامه بشكل أكثر صرامة، على سبيل المثال "الأخطاء المعروفة" حيث أريد أن يكون الإخراج نظيفا، على سبيل المثال في الملف foo.py:
import sys
from subprocess import *
try:
check_call([ 'uptime', '--help' ])
except CalledProcessError:
sys.tracebacklimit=0
print "Process failed"
raise
print "This message should never follow an error."
إذا تم القبض على الإلغاء، فستبدو الإخراج مثل هذا:
[me@test01 dev]$ ./foo.py
usage: uptime [-V]
-V display version
Process failed
subprocess.CalledProcessError: Command '['uptime', '--help']' returned non-zero exit status 1
في حالة حدوث أي خطأ آخر، ما زلنا نحصل على إخراج Traceback الكامل.
استخدم وظيفة Python المضمنة () وهذا هو. لا حاجة لاستيراد أي مكتبة. أنا أستخدم بيثون 3.4
سأفعل ذلك بهذه الطريقة:
import sys
def do_my_stuff():
pass
if __name__ == "__main__":
try:
do_my_stuff()
except SystemExit, e:
print(e)
ماذا عن
import sys
....
....
....
sys.exit("I am getting the heck out of here!")
لا traceback وبشيء أكثر صراحة.
# Pygame Example
import pygame, sys
from pygame.locals import *
pygame.init()
DISPLAYSURF = pygame.display.set_mode((400, 300))
pygame.display.set_caption('IBM Emulator')
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
fontObj = pygame.font.Font('freesansbold.ttf', 32)
textSurfaceObj = fontObj.render('IBM PC Emulator', True, GREEN,BLACK)
textRectObj = textSurfaceObj.get_rect()
textRectObj = (10, 10)
try:
while True: # main loop
DISPLAYSURF.fill(BLACK)
DISPLAYSURF.blit(textSurfaceObj, textRectObj)
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
pygame.display.update()
except SystemExit:
pass