Python 异常
异常简介
raise语句
内置的异常类
自定义异常类
except捕获异常
finally函数处理
异常之禅
异常简介
Python在处理正常和异常,提供了功能强大的替代解决方案--异常处理方式
异常对象未被处理或者捕获时,程序报错终止并显示错误信息
如果只用于显示错误信息,显然毫无意义,所以要捕获该异常并处理
raise语句
引发异常可以采用raise语句去实现,并将一个类(必须是Exception的子类)或者实例化作为参数,如果直接将类作为参数,将自动创建一个实例。
例子:>>>
raise Exception('This is common Error')
Traceback (most recent call last):File "<pyshell#6>", line 1, in <module>
raise Exception('This is common Error')
Exception: This is common Error
内置的异常类
类 名 | 描 述 |
Exception | 几乎所有的异常类都是从它派生出来的 |
AttributeError | 引用属性或给它赋值失败时引起 |
OSError | 操作系统不能执行指定的任务(如打开文件)时引发,有多个子类 |
IndexError | 使用序列中不存在的索引时引发,为LookupError的子类 |
KeyError | 使用映射中不存在的键值时引发,为LookupError的子类 |
NameError | 找不到名称(变量)时引发 |
SyntaxError | 代码不正确的时候引发 |
TypeError | 将内置操作或者函数用于类型不正确的对象时引发 |
ValueError | 将内置操作或者函数用于这样的对象时引发:其类型正确但是包含的值不合适 |
ZeroDivisionError | 在除法或者求模运算的第二个参数为零时引发 |
自定义异常类
自定义异常类最好直接或者间接的继承Exception类
如:class SomeCustomException(Exception):pass
except捕获异常
x = None
try:
x = 1/0
except ZeroDivisionError:
print('Unknow variable')
else:
print('that went well')
首先运行try里面的code block段,出现异常的话便会运行except,这部分代码用于判断是否是内置类里面的0作为除数的Error。如果不出现异常则运行else语句,同时需要注意的是如果except接收的错误类型不对,导致未接收到错误则同样由编译器报错。
如果except不添加错误判断参数,则一旦获取到错误信息则直接进入该函数内。
同时可以添加多个except语句,类似if语句,满足错误条件则进入,否则编译器报错。
或者采用except(ZeroDivisionError,TypeError,NameError):的方法用元组实现判断。
while True:
try:
X = int(input('Enter Your First Value:'))
Y = int(input('Enter Your Second Value:'))
value = X/Y
print(value)
except Exception as e:
print('Error,Please try again')
print('Invalid input',e)
else:
break
不断接受直到接受到正确的输入,并且报错,显示错误信息,由e这个变量决定。
finally函数处理
1/0
except ZeroDivisionError:
print('Unknow variable')
else:
print('that went well')
finally:
print('cleaning up...')
del x
异常之禅
if/else 和try/except的使用比较,在Python内最好使用try/except合适,原因在于try子句只是具备访问属性write,而没用使用它做任何事情。如果引发了AttributeError,说明对象没有属性write,否则就说明有这个属性。