Когда у Вас есть важный класс, но система не может создать экземпляр fo этот класс, потому что
Вы, вероятно, столкнулись с исключительной ситуацией, и программа завершается из-за этого (с обратной трассировкой). Поэтому первое, что нужно сделать, - это перехватить это исключение перед чистым выходом (возможно, с сообщением, приведенным примером).
Попробуйте что-нибудь подобное в своей подпрограмме 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
В общем, использование за исключением:
без имени исключения - плохая идея. Вы поймаете все виды вещей, которые не хотите ловить - например, SystemExit
- и он также может замаскировать ваши собственные ошибки программирования. Мой пример выше глуп, если вы не делаете что-то с точки зрения очистки. Вы можете заменить его на:
import sys
sys.exit(1) # Or something that calls sys.exit().
Если вам нужно выйти, не вызывая SystemExit
:
import os
os._exit(1)
Я делаю это в коде, который выполняется в режиме unittest и вызывает fork ()
. Unittest получает, когда разветвленный процесс вызывает SystemExit
. Это определенно угловой случай!