我有一个程序每几秒查询一次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)
重构这个 - 如果你有足够的失败,你迟早会得到一个stackoverflow错误.
queryRepeatedly应该只是query.它应该返回void并在失败时抛出异常.
包裹看起来像这样的东西,你真正的queryRepeatedly功能?
while True:
try:
query()
except:
#handle
time.sleep(15)
Run Code Online (Sandbox Code Playgroud)
所有循环,不需要递归.
请注意,您必须仔细考虑需要重启的程序数量.从您的问题来看,这听起来像您的实际问题是确保查询可以再次尝试,如果它偶尔失败,这是我的解决方案确保的.但是如果你想清理程序资源 - 比如反弹可能已经破坏的SQL连接 - 那么你需要更仔细地考虑你需要"重启"程序的程度.通常,您需要了解为什么您的查询无法知道要修复的内容,并且在极端情况下,正确的做法是向正在通话的人员发送电子邮件或短信,以便检查情况并编写适当的补丁或修复程序.
| 归档时间: |
|
| 查看次数: |
24542 次 |
| 最近记录: |