2012-03-16 1 views
11

Я хочу знать, правильно ли завершен сценарий Python. Для этого я использую atexit, но проблема в том, что я не знаю, как дифференцироваться, если atexit был вызван с помощью sys.exit (0) или non zero или exception.Как найти код выхода или причину, когда callback atexit вызывается в Python?

Причина: если программа заканчивается правильно, она ничего не сделает, но если программа закончится исключением или вернет код ошибки (статус выхода), отличный от нуля, я хочу вызвать какое-либо действие.

Если вы задаетесь вопросом, почему я не использую try/finally, это потому, что я хочу добавить такое же поведение для дюжины сценариев, которые импортируют общий модуль. Вместо того, чтобы модифицировать их все, я хочу добавить хакеры atexit() к импортируемому модулю и получить это поведение бесплатно во всех них.

+0

Что вы хотите достичь? Почему бы просто не использовать правильную обработку ошибок? –

ответ

7

Вы можете получить решить эту проблему с помощью sys.excepthook и от обезьяны заплат sys.exit():

import atexit 
import sys 

class ExitHooks(object): 
    def __init__(self): 
     self.exit_code = None 
     self.exception = None 

    def hook(self): 
     self._orig_exit = sys.exit 
     sys.exit = self.exit 
     sys.excepthook = self.exc_handler 

    def exit(self, code=0): 
     self.exit_code = code 
     self._orig_exit(code) 

    def exc_handler(self, exc_type, exc, *args): 
     self.exception = exc 

hooks = ExitHooks() 
hooks.hook() 

def foo(): 
    if hooks.exit_code is not None: 
     print("death by sys.exit(%d)" % hooks.exit_code) 
    elif hooks.exception is not None: 
     print("death by exception: %s" % hooks.exception) 
    else: 
     print("natural death") 
atexit.register(foo) 

# test 
sys.exit(1) 
+0

@sorin: Он отлично работает для меня. Я завернул функции hook в классе (который не меняет функциональность) и добавил 'sys.exit (1)'. Он печатает 'sys.exit (1)' для меня на Python 2.7. –

+0

@sorin: Возможно, вы забыли «глобальный exit_code» внутри 'patched_exit'? Сначала я забыл об этом, но отредактировал его сразу после отправки ответа. –

+1

Также работает на Python 3. –

 Смежные вопросы

  • Нет связанных вопросов^_^