Python:当发生外部异常时如何正确地继续while循环

时间:2014-02-23 15:35:41

标签: python while-loop continue

我不是程序员,所以非常愚蠢的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...

或者其他方式,但我在这里想要理解的是为什么我做错了?我显然错过了什么。

我已经阅读了一些类似的问题和外部资源,但没有找到明确的解释为什么我要做的事情不起作用

谢谢!

1 个答案:

答案 0 :(得分:1)

当您收到错误消息时,您会再次从whois_loop()内部调用do_whois,这意味着您可以在深层结束多次递归调用,因此会有多个"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部分就会运行,因此您可以继续使用。)