Python——为什么是';除了VauleError';循环时线路不中断?

Python——为什么是';除了VauleError';循环时线路不中断?,python,Python,我正在windows系统中使用Ipython笔记本。python版本是2.7 df是一个数据帧,只包含4个超出该负载范围的值。据我所知,“except VauleError”将只执行4次。 但为什么下面的代码会继续执行“except ValueError”行和“print amp_p,amp_n”无休止地执行?我不知道为什么,但最后我在“print amp_p,amp_n”后面加上了“break”,然后它就开始工作了。据我所知,“except ValueError”应该能够中断while循环 i

我正在windows系统中使用Ipython笔记本。python版本是2.7

df是一个数据帧,只包含4个超出该负载范围的值。据我所知,“except VauleError”将只执行4次。 但为什么下面的代码会继续执行“except ValueError”行和“print amp_p,amp_n”无休止地执行?我不知道为什么,但最后我在“print amp_p,amp_n”后面加上了“break”,然后它就开始工作了。据我所知,“except 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

这是因为您的
try-catch
块仍在
while
循环的范围内。您应该将
while
循环放在
try
块内。

这是有意义的,因为在捕获到异常之后,程序将继续运行,直到except块的末尾,然后在try except块之后继续运行剩余的行,直到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循环或任何循环。如果异常发生且未被捕获,则会中断程序的while循环,而不是while循环或任何其他循环

如果异常发生并被捕获,程序将在捕获异常的except块中继续

在任何一种情况下,它都不会中断while循环,除非while循环在try块中并且异常发生在try块中:

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

但即使在上述情况下,严格地说,我们的理解仍然是异常不会中断while循环。它只是中断程序的路径并转到最近的except块。

感谢您的解释。我想我现在知道了,因为如果没有异常块的中断,while循环将由于while循环不在DataFrame中的值上移动,因此,当添加break时,程序可以从while循环跳转到For循环,然后再跳转到下一个值。我只是按照我搜索到的一些教程进行操作,但不完全理解,因此会犯这样的错误。谢谢。