600X笔记(week-4 调试、断言和异常)
600x感觉讲得更偏向于导论,这么快调试、断言和异常了。
嗯。。让我想想廖大的教程顺序应该是先数据类型,条件判断,循环,函数(函数的参数),递归函数,高级特性(然后里面有生成器、迭代器),高阶函数(闭包、装饰器、偏函数),模块,面对对象编程(类和实例),面对对象高级编程(定制类),然后再到调试、断言异常。
这里直接上几个代码加深印象:
def FancyDivide(numbers, index):
try:
try:
denom = numbers[index]
for i in range(len(numbers)):
numbers[i] /= denom
except IndexError as e:
FancyDivide(numbers, len(numbers) - 1) #会再一次调用Finally
else: #当上一个语言块没有被执行时执行
print ("1")
finally:
print ("0")
except ZeroDivisionError as e:
print ("-2")
上式的FancyDivide([0, 2, 4], 4)
答案是1,0,0
,注意顺序:是先输出else
的1,然后输出因错误返回的Finally
,最后输出最外层的Finally
。
#最初输出错误含'Hello'
def FancyDivide1(list_of_numbers, index):
try:
try:
denom = list_of_numbers[index]
for i in range(len(list_of_numbers)):
list_of_numbers[i] /= denom
finally:
raise Exception("Hello")
except Exception as e:
print(e)
#最后输出错误含'Hello'
def FancyDivide2(list_of_numbers, index):
try:
try:
raise Exception("Hello")
finally:
denom = list_of_numbers[index]
for i in range(len(list_of_numbers)):
list_of_numbers[i] /= denom
except Exception as e:
print(e)
使用FancyDivide([0, 2, 4], 0)
比较上面代码可以看出except
不是叠加,只接受最后一个错误。