Python:发生外部异常时如何正确继续while循环
Posted
技术标签:
【中文标题】Python:发生外部异常时如何正确继续while循环【英文标题】:Python: how to properly continue a while loop when an external exception occurs 【发布时间】:2014-02-23 15:35:41 【问题描述】:我不是程序员,所以这里的 Python 问题非常愚蠢。
所以,我有一个脚本可以批量检查域列表的 whois 信息。这是一个小例子来说明我的问题:
import pythonwhois as whois
domainList = ['aaaa', 'bbbb', 'ccccc', 'example.com']
def do_whois(domain):
try:
w = whois.get_whois(domain)
print 'Everything OK'
return w
except:
print 'Some error...'
whois_loop()
def whois_loop():
while domainList:
print 'Starting loop here...'
domain = domainList.pop()
w = do_whois(domain)
print 'Ending loop here...'
whois_loop()
使用有效域的脚本的输出是:
Starting loop here...
Everything OK
Ending loop here...
Starting loop here...
Some error...
Starting loop here...
Some error...
Starting loop here...
Some error...
Ending loop here...
Ending loop here...
Ending loop here...
我的目标是:
当 do_whois() 函数失败时(因为 例如),whois_loop() 应该从下一个域开始。我不明白的地方:
当 do_whois() 出现异常时,为什么 while_loop() 似乎在 w = do_whois(domain) 行之后继续执行 功能?因为它打印出'Ending loop here...'而没有 '在这里开始循环......',但我不明白为什么会这样 正在发生。如果有一个 while 循环不应该到达该行 例外(当然我错了)。例如,我可以在 while_loop() 上设置一个 if 条件来解决这个问题:
w = do_whois(domain)
if not w:
continue
print 'Ending loop here...'
那会打印出来:
Starting loop here...
Everything OK
Ending loop here...
Starting loop here...
Some error...
Starting loop here...
Some error...
Starting loop here...
Some error...
或其他方式,但我在这里试图理解的是为什么我做错了?我显然错过了一些东西。
我已经阅读了一些类似的问题和外部资源,但没有找到关于为什么我尝试做的事情不起作用的明确解释。
谢谢!
【问题讨论】:
“我不是程序员”——是的,你是!你写代码。 您是否尝试过在 while 循环中使用“try except”?您可以在打印错误后执行“继续”。 另请注意,一旦将错误处理移至 while 循环,就无需从 do_whois 内部调用 whois_loop。 您确定要捕获任何个可能的异常吗?甚至ComputerIsOnFire
?请参阅this 相关问题。
【参考方案1】:
当你遇到错误时,你会从do_whois
内部再次调用whois_loop()
,这意味着你最终可以进行多次递归调用,因此会出现多个"Ending loop here..."
。这是不必要的。一旦do_whois
返回,循环将继续,无论您是否在其中处理了错误(实际上,在函数内部“安静地”处理错误的关键在于调用函数不必知道它)。
请尝试:
def do_whois(domain):
try:
w = whois.get_whois(domain)
except:
print 'Some error...'
else:
print 'Everything OK'
return w
(请注意,try
中的内容越少越好;如果没有引发错误,else
部分将运行,因此您可以继续。)
【讨论】:
以上是关于Python:发生外部异常时如何正确继续while循环的主要内容,如果未能解决你的问题,请参考以下文章