异常:
while True:
try:
price=float(input("请输入价格:"))
print("价格为:%5.2f"%price)
break
except ValueError:
print("您输入的数字不是数字")
在上面程序的执行过程中,当输入的不是数字的时候,float函数产生一个valueError异常,
立刻停止try中下面代码的执行,转而执行,异常处理模块再进行下一次循环,知道进行输入的是数字才进行打印以及跳出循环。
捕获与处理异常
try:
x=float(input("请输入设备成本:"))
y=int(input("请输入分摊年数:"))
z=x/y
print("每年分摊费用:%.2f"%z)
except ZeroDivisionError:
print("输入异常,分摊年数不可以为0")
except:
print("输入异常") #上述异常都不匹配执行该语句
else:
print("没有异常") #没有异常发生
finally:
print("有没有异常都需要执行finally语句")
自定义异常类
class InvalidNumberError(ArithmeticError): #自定义异常类
def __init__(self,num):
super(InvalidNumberError,self).__init__()
self.num=num
def getNum(self):
return self.num
try:
x=float(input("请输入设备成本:"))
y=int(input("请输入分摊年数:"))
z=x/y
if z>10:
raise InvalidNumberError(z) #显示抛出自定义异常类
print('每年分摊金额:%.2f'%z)
except ZeroDivisionError:
print("输入异常,年数不能为0")
except InvalidNumberError as ex:
print("每年分摊的金额为%.2f大于10了,重新分配。"%ex.getNum())
except:
print("输入有误")
with语句
try:
f=open(r'a.txt','r')
for line in f:
print(line,end='')
finally:
f.close()
上述语句用可以用with语句简写,with不需要try—finally语句来确保文件对象关闭,无论是否出现异常,文件对象都由系统自动关闭。
只有接受上下文管理协议的对象才能使用with语句。
with open(r'a.txt','r') as f:
print(f)
for line in f:
print(line,end='')
断言
格式:assert expression[,arguments]
expression是断言表达式,如果为真断言成功,如果为假触发AssertionError异常,arguments是断言表达式为假时传递给AssertError对象的字符串。
也可以用try_excep捕获AssertError异常。
try:
assert 2==1*1,'表达式运算符号错误'
except AssertionError as arg:
print(" %s,%s"%(arg.__class__.__name__,arg))