异常后重新启动程序

vro*_*del 11 python function

我有一个程序每几秒查询一次API.每个响应都触发一些函数,这些函数本身会对网站进行一些调用,而这些函数是我不想盲目信任的调用.foo()例如,如果我在foo()调用的函数中捕获异常,是否可以在except块中完全重启程序?本质上,我想queryRepeatedly()在其子函数之一中调用异常,而不保留先前的堆栈调用.

当然,我可以返回标记值并以另一种方式解决,但程序的结构使得上述方法看起来更简单,更清晰.

# Sample "main" function that I want to call
def queryRepeatedly():
    while True:
        foo()
        bar()
        baz()
        time.sleep(15)

def foo():
    # do something
    try:
        foo2() # makes a urllib2 call that I don't trust
    except:
        #restart queryRepeatedly

queryRepeatedly()
Run Code Online (Sandbox Code Playgroud)

任何建议表示赞赏!谢谢.

aba*_*ert 19

要重新启动任何东西,只需使用外部while循环.例如:try

def foo():
    while True:
        try:
            foo2()
        except:
            pass
        else:
            break
Run Code Online (Sandbox Code Playgroud)

如果你想在链上传递异常,只需在外部函数而不是内部函数中执行此操作:

def queryRepeatedly():
    while True:
        while True:
            try:
                foo()
                bar()
                baz()
            except:
                pass
            else:
                break
        time.sleep(15)

def foo():
    foo2()
Run Code Online (Sandbox Code Playgroud)

所有缩进都有点难以阅读,但很容易重构:

def queryAttempt()
    foo()
    bar()
    baz()

def queryOnce():
    while True:
        try:
            queryAttempt()
        except:
            pass
        else:
            break

def queryRepeatedly():
    while True:
        queryOnce()
        time.sleep(15)
Run Code Online (Sandbox Code Playgroud)

但是如果你考虑一下,你也可以将两个while循环合并为一个.使用continue可能有点令人困惑,但看看你是否更喜欢它:

def queryRepeatedly():
    while True:
        try:
            foo()
            bar()
            baz()
        except:
            continue()
        time.sleep(15)
Run Code Online (Sandbox Code Playgroud)


dje*_*lin 6

重构这个 - 如果你有足够的失败,你迟早会得到一个stackoverflow错误.

queryRepeatedly应该只是query.它应该返回void并在失败时抛出异常.

包裹看起来像这样的东西,你真正的queryRepeatedly功能?

while True:
    try:
        query()
    except:
        #handle
    time.sleep(15)
Run Code Online (Sandbox Code Playgroud)

所有循环,不需要递归.

请注意,您必须仔细考虑需要重启的程序数量.从您的问题来看,这听起来像您的实际问题是确保查询可以再次尝试,如果它偶尔失败,这是我的解决方案确保的.但是如果你想清理程序资源 - 比如反弹可能已经破坏的SQL连接 - 那么你需要更仔细地考虑你需要"重启"程序的程度.通常,您需要了解为什么您的查询无法知道要修复的内容,并且在极端情况下,正确的做法是向正在通话的人员发送电子邮件或短信,以便检查情况并编写适当的补丁或修复程序.