簡體   English   中英

Python:當發生外部異常時如何正確地繼續while循環

[英]Python: how to properly continue a while loop when an external exception occurs

我不是程序員,所以非常愚蠢的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'而沒有'Starting 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...

或者其他方式,但我在這里想要理解的是為什么我所做的是錯的? 我顯然錯過了什么。

我已經閱讀了一些類似的問題和外部資源,但沒有找到一個明確的解釋, 為什么我要做的事情不起作用

謝謝!

當你收到一個錯誤時,你會再次從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部分會運行,因此您可以繼續執行。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM