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

标签 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) 行之后继续执行 函数? 因为它打印出“在这里结束循环...”而没有 '在这里开始循环......',但我不明白为什么会这样 发生。如果有一个 while 循环不应该到达那条线 异常(exception)(当然我错了)。

我可以解决这个问题,例如在 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...

或其他方式,但我在这里想了解的是为什么我做的是错的?我显然遗漏了一些东西。

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

谢谢!

最佳答案

当你得到一个错误时,你从 do_whois 中再次调用 whois_loop(),这意味着你可以结束几个深度递归调用,因此多个 “在这里结束循环...”。这是不必要的。一旦 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循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21970319/

相关文章:

python - 在 Python 中使用 float 切片 ndarray

python - Python递归期间的变量范围错误

java - while 循环的问题

java - GOTO/继续 Java 动态编程

c# - 有没有办法在 C# 中继续异常?

python - celery 中@task装饰器之后的装饰器

python - 如何在不知道行号的情况下将文件读取为以给定单词开头的字符串?

validation - 使用nonewline在while循环中对读取主机数据条目进行Powershell验证

BASH echo 与 sed

go - 在 Go 中命名标签的标准做法是什么?