为什么剂量在列表赋值之前导致break语句不执行?

时间:2017-09-25 23:06:41

标签: python list

我在try-except块中使用python 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='')
  

1 2 3 4 5

为什么列表分配导致中断不再发生?有人可以解释这里发生了什么。

2 个答案:

答案 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

答案 1 :(得分: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.append(i)

insert

lst.insert(0, i)

取决于你想做什么。阅读更多here