2017-09-25 33 views
-1

我遇到了一個奇怪的行爲,在try-except塊中使用python break語句。爲什麼前面的列表賦值導致break語句不執行?

i=0 
lst=[] 
while i < 5: 
    try: 
     if i < 3: 
      raise Exception('spam', 'eggs') 
     #lst[0]=i 
     print('-'+str(i)+'-') 
     break 
    except: 
     i=i+1 
     print(str(i)+' ',end='') 

1 2 3 -3-

但是如果刪除註釋行:

i=0 
lst=[] 
while i < 5: 
    try: 
     if i < 3: 
      raise Exception('spam', 'eggs') 
     lst[0]=i 
     print('-'+str(i)+'-') 
     break 
    except: 
     i=i+1 
     print(str(i)+' ',end='') 

爲什麼有列表分配的原因d突破不再發生?有人能解釋這裏發生了什麼嗎?

+1

因爲它引發了一個異常。 – user2357112

+1

除了塊捕獲_all_錯誤,包括'IndexError'。 – Lafexlos

+0

**請勿使用裸露的條款** –

回答

4

lst是一個空的列表。試圖訪問不存在的元素,如lst[0]將引發IndexError異常。那個異常然後被捕獲到異常處理程序中,從而破壞了預期的結果。

首先,你通常不應該使用裸露的異常處理程序;將您的異常處理程序限制爲它知道如何處理的異常。無限制的異常處理程序可以讓意外的異常隱藏,就像這裏的情況一樣。

如果你想索引存儲在lst要麼確保您的名單是足夠長的時間,或使用append()insert()將其添加到年底,或在列表的開頭。

使用Exception創建自己的異常往往不這樣做可能是因爲它使得難以您的異常區別於他人的最好的事情:

for i in range(2): 
    try: 
     if i == 0: 
      raise Exception('spam', 'eggs') 
     else: 
      1/0 # cause ZeroDivisionError 
    except Exception as e: 
     print(repr(e)) 

運行該代碼輸出:

 
Exception('spam', 'eggs') 
ZeroDivisionError('division by zero',) 

由於ZeroDivisionErrorException的子類,因此它也被處理程序捕獲。爲了解決這個問題,你可以創建自己的Exception子類:

class MyException(Exception): 
    pass 

現在你可以很容易地檢查你知道如何處理異常:

for i in range(2): 
    try: 
     if i == 0: 
      raise MyException('spam', 'eggs') 
     else: 
      1/0 # cause ZeroDivisionError 
    except MyException as e: 
     print(repr(e)) 

運行這段代碼:

 
MyException('spam', 'eggs') 
Traceback (most recent call last): 
    File "", line 6, in 
ZeroDivisionError: division by zero 

顯示您的自定義異常被捕獲並處理,但意外的異常不是。如果你要處理的意外之輩,然後添加第二個異常處理程序後的第一個:

except MyException as e: 
     print(repr(e)) 
    except Exception as e: 
     print('Unexpected exception', e) 
     raise 
+0

Doh!謝謝! –

1

如果你對異常:

i=0 
lst=[] 
while i < 5: 
    try: 
     if i < 3: 
      raise Exception('spam', 'eggs') 
     lst[0]=i 
     print('-'+str(i)+'-') 
     break 
    except Exception as e: 
     print(e) 
     i=i+1 
     print(str(i)) 

你會意識到,你得到一個IndexError

list assignment index out of range 

由於您的列表爲空,因此您無法在該索引處訪問/分配。如果你想插入項目到列表中使用append:這取決於你想要做什麼

lst.insert(0, i) 

lst.append(i) 

insert。閱讀更多here

+0

也是一個非常教育的答案。 –

相關問題