Python提供了异常和断言来处理程序中出现的异常和错误。
Python中所有的异常类的根类都是BaseException类,其下有三个子类:
- Exception类,大部分常规的异常类的基类都是Exception,的子类。
- SystemExit类:程序的退出异常
- KeyboardInterrupt:因用户按下Ctrl+C组合建(Linux中)来终止命令行程序而触发。
try/except来检测语句的异常;
格式如下:
try :
<可能出现异常的语句块>
except 异常名:
异常处理
except 异常名:
异常处理
except 异常名:
异常处理
else:
处理语句
finally:
处理语句
注意,else是当之前的异常都不是的时候将执行else中的操作,而finally里面的处理是,无论是否发生异常,还是异常与下面的异常都不匹配,都将会执行,即使没有没有发生异常。
例子:
while True:
try:
x = float(input('请输入价格'))
print('价格为 %5.3f' % x)
except ValueError:
print("您输入的不是数字")
except Exception:
print("输入有误")
else:
print("没有作物或异常")
finally:
print("这句话始终要执行的")
自定义异常
自定义异常需要raise来自己抛出异常。
class MyException (Exception): #这是自己定义的一个异常类
def __init__(self, num):
super(MyException, self).__init__()
self.num = num
def getnum(self):
return self.num
while True:
try:
x = float(input('请输入价格'))
if x < 0:
raise MyException(x) #显示抛出这个异常
print('价格为 %5.3f' % x)
except ValueError:
print("您输入的不是数字")
except MyException as e: #接收这个异常
print("%f太小,输入不能为负数" % e.getnum())
else:
print("没有作物或异常")
finally:
print("这句话始终要执行的")
with语句
with语句就是化简try、except语句,但是,使用是有局限性的。比如,在打开文件后,可以再try语句的finally中把文件关闭掉,而with语句无论程序是否出现了异常,文件系统都有系统自动关闭。
使用范围:file, decimal , Context, thread, LockType, threading, Lock, threading, RLock, Condition, semaphore, BoundedSemaphore等。
with open("111.txt", 'r') as f:
for line in f:
print(line)
断言
断言是申明表达式为真的判定,如果表达式为假,则抛出异常,如果判定为真,不做任何操作。
try:
assert 2 == 1 * 1, "表达式错误" #后面的字符串就是传入的参数。arg
except AssertionError as arg:
print(arg.__class__.__name__)
print(arg)
try:
assert 2 == 1 + 1, "表达式错误"
except AssertionError as arg:
print(arg.__class__.__name__)
print(arg)
'''
输出:
AssertionError
表达式错误
'''