我在Windows系统中使用Ipython Notebook.python版本是2.7。
df是pandas DataFrame,只包含4个超出负载范围的值。据我所知,除了VauleError'只会被罚4次。 但是为什么下面的代码会继续执行除ValueError'之外的其他代码。线和'打印amp_p,amp_n'不休?我不知道为什么,但最后我添加了“打破”#39;在打印amp_p之后,amp_n'它然后工作。据我所知,除了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
答案 0 :(得分:2)
这是因为您的try-catch
块仍然在while
循环的范围内。您应该将while
循环放在try
块中,而不是。
答案 1 :(得分:2)
这是有意义的,因为在捕获异常之后,程序将继续运行直到除块结束,然后继续运行剩余的行,同时在try-except块之后循环直到结束(在你的情况下,不再有)并最终检查while条件中的条件是否为True。在您的情况下,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循环或任何其他循环。
如果发生异常并且被捕获,程序将在其捕获异常的except块中继续。
在任何一种情况下,循环时都不会中断,除非你的while循环在try块中并且try块中发生了异常:
try:
while (x):
#exception occurs here
except:
但即使在上述情况下,严格来说,理解仍然是不打破while循环。它只是打破程序的路径并转到最近的除了块。