如何从自定义库结束主要功能?

时间:2014-04-24 17:46:49

标签: python exit exit-code quit

我使用不同python脚本的列表来实现各种功能。为了帮助实现这一点,我将所有可重用的功能组织到自定义库中。但是,我发现很多这些函数都会因为奇怪的原因而出错,有些是已知的,有些是未知的。我设计了下面的函数,至少让我看到错误信息,然后向我扔了一个巨大的追溯。我在一个库中有以下命令:

FooBar = trace_check(lambda: Foo(bar))

这是单独库中的错误捕获功能:

def trace_check(func):
    try:
        return func()
    except:
        TracebackString = traceback.format_exc() ###This gets the traceback as a string.
        type, message, tracebacklocation = sys.exc_info() ###This gets the components, particularly the message.
        print "An error has occurred with the following error message:"
        print type    ###Example is IOError
        print message     ###The message associated with the error
        TracebackPrompt = ask("Do you want to see the entire traceback?") #Returns True/False value
        if TracebackPrompt:
            print TracebackString
        print 'Exiting Python Script' ###This shows me it gets to this point.
        sys.exit(0)  ###This is the problem
        print "Did it work?"    ###This statement does not print, so exit worked...

当trace_check运行并且我收到错误时,sys.exit只退出函数返回main()而不是结束main。如果我使用os._exit()代替,main()函数正确结束,但运行脚本的程序也会死掉。一个命令不够强大,另一个命令有点过分......我可以做些什么来确保main()函数结束?

注意:我尝试将trace_check函数的内容放入第一个库中,但同样的事情发生在库调用结束但不是main()。

tl; dr - Python:main()在库中调用函数,该函数在单独的库中调用第二个函数。第二个函数有一个sys.exit()命令,它只退出到main()而不是结束main()。 os._exit()杀死shell并且过度杀伤(需要重启shell TT ^ TT)。还有另一种方法可以从函数库中结束main()吗?

2 个答案:

答案 0 :(得分:1)

要直接回答您的问题,如果您想处理来自main的sys.exit()调用,那么您应该捕获sys.exit()引发的SystemExit异常。下面的示例代码说明了如何执行此操作。

import sys


def func():
    sys.exit(1)


def main():
    try:
        func()
    except SystemExit:
        print 'Someone sys.exit()d'
    return 0


if __name__ == '__main__':
    sys.exit(main())

然而!您应该重新设计您的库。您应该引发异常,而不是在发生意外情况时调用sys.exit()。让图书馆突然退出解释器是糟糕的设计。

答案 1 :(得分:0)

你可以尝试通过抛出异常来设置它:

class ExitFromMain(Exception):
    pass   

def trace_check(func):
    try:
        # try stuff
    except:
        # traceback stuff you had
        raise ExitFromMain()

def main():
    try:
        # Stuff
        trace_check()
        # More stuff that will not run if the exception is thrown
    except ExitFromMain:
        print "I hit my excception to flag a quit from this function"
        sys.exit(0)
相关问题