2016-03-27 37 views
2

我在Windows系統中使用Ipython Notebook。Python版本是2.7。Python-爲什麼'VauleError'行在循環中不會中斷?

df是pandas DataFrame,只包含超出該範圍的4個值。據我所知,'VauleError除外'將只執行4次。 但爲什麼下面的代碼會繼續執行'except ValueError'行和'print amp_p,amp_n'無休止地執行?我不知道爲什麼,但最後我在'print amp_p,amp_n'之後加上'break',然後它就起作用了。據我所知,'除了ValueError'應該能夠打破while循環。

import numpy as np 
from scipy import interpolate 
import PitchBearing_wohler as pw 
load = np.linspace(-8000,8000,num=10,endpoint=True) 
result=pd.read_csv('result.csv',header=None) 
result[0] 
SCF=3. 
D=0. 
srf=1 
f=interpolate.interp1d(load,result[0]) 
for col in df.columns: 
    for ind in df.index: 
     cycle=df[col][ind] 
     if cycle==0.: 
      pass 
     else: 
      amp_p=float(col)/2.+float(ind) 
      amp_n=float(ind)-float(col)/2. 
      while True: 
       try: 
        range_new=f(amp_p)-f(amp_n) 
        mean_new=(f(amp_p)+f(amp_n))/2 
        break 
       except ValueError: 
        print amp_p,amp_n,cycle 
        #break # Added after I found the while loop won't break 

回答

2

這是因爲你的try-catch塊仍然是while循環的範圍內。您應該將while循環放入您的try塊中。

2

這是有道理的,因爲你逮住異常後,程序將繼續運行,直到除了塊,然後結束繼續運行,其餘行while循環後try-except塊,直到結束(在你的情況下,沒有了),並最終檢查while條件中的條件是否保持爲真。在你的情況下,while循環的條件保持爲True,因此循環繼續。

while True: 
    try: 
     range_new=f(amp_p)-f(amp_n) 
     mean_new=(f(amp_p)+f(amp_n))/2 
     break 
    except ValueError: 
     print amp_p,amp_n,cycle 

有一件事你似乎誤會這裏是你認爲的異常應該打破while循環,而實際上除了做while循環或循環不休息。如果異常發生並且沒有捕獲到,它會中斷程序,而不是一個while循環或任何其他循環。

如果發生異常並被捕獲,程序將繼續捕獲異常的except塊中。

在這兩種情況下,不破 while循環,除非你的while循環try塊,並在try塊發生異常:

try: 
    while (x): 
     #exception occurs here 
except: 

但是,即使在上述情況下,嚴格來說,理解仍然是,而不是破除while循環。它只是打破了程序的路徑,並且去了最近的一個塊。

+0

感謝您的解釋。我想我現在知道,因爲沒有在異常塊中斷,while循環將停留在創建valueerror的同一個值,因爲while循環不會在DataFrame中的值上移動,然後,程序可以從while循環跳轉到For循環並移到下一個值。我只是按照我搜索的一些教程,並不完全理解並犯這樣的錯誤。謝謝。 –

+0

@shengfeiwu是的,沒錯。 :) 你懂了! – Ian

相關問題