我在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
为什么列表分配导致中断不再发生?有人可以解释这里发生了什么。
答案 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',)
因为ZeroDivisionError
是Exception
的子类,所以它也被处理程序捕获。要解决此问题,您可以创建自己的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。