簡體   English   中英

錯誤時正確退出While循環

[英]Proper Exiting of While Loop on Error

我很好奇使用while循環處理此錯誤的“正確” pythonic方法是什么。 在此示例中,我可以簡單地檢查字符串以事先查看其是否具有[-1]字符,但是此問題基於此示例的實際代碼要復雜得多。

try:
    while mystring[-1] == '!' #Will throw an error if mystring is a blank string
         print("Exclamation!")
         mystring = mystring[:-1]
    return mystring
except:
    return ""

實際上,我的問題是我的while循環取決於檢查,偶爾在循環內進行某些處理后,該檢查會拋出錯誤。 以上只是對該問題的(也許是過度的)簡化說明。 我通過一系列try:excepts:修復了它,但是我覺得那不是解決此問題的“正確”方法。

例如,您可以簡單地執行以下操作:

while mystring and mystring[-1] == '!':
    print("Exclamation!")
    mystring = mystring[:-1]
return mystring

這將起作用,因為如果mystring為空,它將短路並結束循環,因此您將永遠不會嘗試訪問空字符串的-1索引

編輯:正如Winston所指出的,您可以通過使用str.endswith來擺脫所有特殊的大小寫,如以下代碼所示

while mystring.endswith('!'):
    print("Exclamation!")
    mystring = mystring[:-1]
return mystring

當前代碼不應該做的兩件事:

  1. 捕獲任何異常,您應該只捕獲感興趣的特定異常
  2. 在try塊中包括整個循環,您應該盡可能只包括引發異常的語句/表達式

如果您發現自己在python中經常使用while循環,則表明您沒有最有效地使用python。 給定python的工具集,您幾乎應該始終使用某種for循環。 沒有看到您的代碼的真實示例,我不能說這是否是真的。 如果您需要該領域的幫助,請在http://codereview.stackexchange.com上發布一些代碼。

解決此問題的一般方法是編寫一個處理異常的函數並使用它。

def last_character(string):
    try:
       return string[-1]
    except IndexError:
       return ' '

while last_character(mystring) == '!'
    mystring = mystring[:-1]
return mystring

實際上,在許多情況下,它們已經具有與標准結構相同的無例外等效項。 可以使用.endswith()方法輕松編寫此循環。 通過使用這些內容或精心制作自己的內容,您可以最干凈地處理異常。

使用mystring.rstrip('!')刪除'!' 字符串末尾的字符;-)

如果問題復雜得多,則正確的方法是捕獲操作拋出的IndexError。

try:
    while mystring[-1] == '!' #Will through an error if mystring is a blank string
         print("Exclamation!")
         mystring = mystring[:-1]
    return mystring
except IndexError:
    return ""

另一種方法是檢查字符串是否為空,並避免使用引發異常的操作:

while mystring and mystring[-1] == '!': # lazy boolean expression evaluation
      mystring = mystring[:-1]
return mystring

沒有懶惰布爾表達式求值的其他版本:

if not mystring:
    return mystring
while mystring[-1] == '!':
    mystring = mystring[:-1]
    if not mystring:
        break
return mystring

我個人喜歡第二個版本,特別是如果您更改mystring [-1] =='!' 使用mystring.endswith('!')(但是在這種情況下,您不需要檢查是否為空,因為endswith已經為您完成了此操作)。

暫無
暫無

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

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