【问题标题】:Python- Why the 'except VauleError' line dose not break while loop?Python-为什么'except ValueError'行不会中断while循环?
【发布时间】:2016-03-27 15:19:13
【问题描述】:

我在windows系统中使用Ipython Notebook,python版本是2.7。

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

【问题讨论】:

    标签: python


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这是有道理的,因为在您捕获异常之后,程序将继续运行直到 except 块结束,然后在 try-except 块之后继续运行剩余的 while 循环直到结束 (在您的情况下,不再存在),最后检查 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 循环,除非您的 while 循环位于 try 块中并且异常发生在 try 块中:

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

      但即使在上述情况下,严格来说,理解仍然是异常打破了while循环。它只是打破程序的路径并转到最近的 except 块。

      【讨论】:

      • 感谢您的解释。我想我现在知道了,因为没有异常块中的中断,while 循环将停留在创建 valueerror 的相同值上,因为 while 循环不会移动值在 DataFrame 中,当添加了 break 时,程序可以从 while 循环跳转到 For 循环并移动到下一个值。我只是按照我搜索的一些教程并没有完全理解并且犯了这样的错误。谢谢。
      猜你喜欢
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 2021-01-30
      • 2013-11-01
      • 2021-12-26
      相关资源
      最近更新 更多