我使用不同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()吗?
答案 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)