代码如下:
def fancy_divide(list_of_numbers, index):
try:
try:
raise Exception("0")
finally:
denom = list_of_numbers[index]
for i in range(len(list_of_numbers)):
l ist_of_numbers[i] /= denom
except Exception as ex:
print(ex)
如果我打电话:
fancy_divide([0, 2, 4], 0)
为什么不打印“0”?你知道吗
如果我这样编辑代码:
def fancy_divide(list_of_numbers, index):
try:
try:
raise Exception("0")
finally:
denom = list_of_numbers[index]
for i in range(len(list_of_numbers)):
list_of_numbers[i] /= denom
except Exception as ex:
raise Exception("0")
print(ex)
然后调用同样的东西,它打印:
Traceback (most recent call last):
File "<ipython-input-16-c1b0ac98281c>", line 1, in <module>
fancy_divide([0, 2, 4], 0)
File "/Users/dsn/.spyder-py3/temp.py", line 10, in fancy_divide
raise Exception("0")
Exception: 0
为什么?什么是正确的方法/什么时候应该使用raise?你知道吗
您的
finally
块本身引发了一个异常,一个被零除的错误(因为分母是0)。如果finally
块在异常冒泡时执行,并引发自己的异常,则它可以:您的其他代码打印回溯,因为您根本没有捕获您引发的第二个异常(它绕过了
print
)。你知道吗我建议reading the exception tutorial去理解更多;你的示例代码是如此的矫揉造作/毫无意义,以至于你不可能说出你真正的误解是什么,什么只是为了说明一个特定的行为来支持你的问题。你知道吗
注意数字
1.首先触发第二个
try
之外的except
块,然后忽略其他块。你知道吗2.当
try
块中出现异常时,将触发此操作。你知道吗在
except
块中使用raise来避免复杂的事情。你知道吗我会把你的代码改写为:
相关问题 更多 >
编程相关推荐