Python 编程导论 Chapter 7 —— 异常与断言
typora-copy-images-to: Python 编程导论
Python 编程导论 Chapter 7 —— 异常与断言
-
异常,定义为不符合规范的东西
-
异常类型:
- TypeError
- IndexError
- NameError
- ValueError
7.1 处理异常
# 普通代码
successFailureRatio = numSuccesses/numFailures
print('The success/failure ratio is', successFailureRatio)
print('Now here')
# 改写为异常处理代码
try:
successFailureRatio = numSuccesses / numFailures
print('The success / failure ratio is', successFailureRatio)
except ZeroDivisionError:
print('No failures, so the success / failure ratio is undefined')
print('Now here')
# 实际练习实现一个满足以下规范的函数。请使用 try-except 代码块
def sumDigits(s):
"""假设s是一个字符串
返回s中十进制数字之和
例如,如果s是'a2b3c',则返回5"""
# 自行思索的过程:
c = "a2b3c"
e = []
for num in c:
try:
d = int(num)
e.append(d)
except ValueError:
pass
result = sum(e)
print(result)
while True:
val = input('Enter an integer: ')
try:
val = int(val)
print('The square of the number you entered is', val**2)
break #跳出while循环
except ValueError:
print(val, 'is not an integer')
# 多态的函数
def readVal(valType, requestMsg, errorMsg):
while True:
val = input(requestMsg + ' ')
try:
return(valType(val)) #返回前将str转换为valType
except ValueError:
print(val, errorMsg)
readVal(int, 'Enter an integer:', 'is not an integer')
# 上述代码可以兼容各种类型的参数
- 如果一段程序代码中可能引发的异常类型不止一种,那么保留字 except 后面可以接一个异常元组 except (ValueError, TypeError):
7.2 将异常用作控制流
- 处理错误的标准方法是使函数返回一个特定值
# 实际练习
def findAnEven(L):
"""假设L是一个整数列表
返回L中的第一个偶数
如果L中没有偶数,则抛出ValueError异常"""
def findAnEven(L): #未完成
"""假设L是一个整数列表
返回L中的第一个偶数
如果L中没有偶数,则抛出ValueError异常"""
all_even = []
try:
for item in L :
if item % 2 == 0 :
all_even.append(item)
print(all_even[0])
except:
raise ValueError('No Even number at all !')
findAnEven([1,5,3,3])
# 同样规范的另一种实现
def getRatios(vect1, vect2):
"""假设vect1和vect2是长度相同的数值型列表
返回一个包含vect1[i]/vect2[i]中有意义的值的列表"""
ratios = []
if len(vect1) != len(vect2):
raise ValueError('getRatios called with bad arguments')
for index in range(len(vect1)):
vect1Elem = vect1[index]
vect2Elem = vect2[index]
if (type(vect1Elem) not in (int, float)) or (type(vect2Elem) not in (int, float)):
raise ValueError('getRatios called with bad arguments')
if vect2Elem == 0.0:
ratios.append(float('NaN')) #NaN = 不是一个数
else:
ratios.append(vect1Elem/vect2Elem)
return ratios
7.3 断言
assert Boolean expression
assert Boolean expression, argument
-
执行 assert 语句时,先对布尔表达式求值。如果值为 True ,程序就愉快地继续向下执行;如果值为 False ,就抛出一个 AssersionError 异常
-
确保函数参数具有恰当的类型