导论
世界之大,分类为之,异常那些类,请看如下计算
print(BaseException.__subclasses__())
执行结果:
[<class 'Exception'>, <class 'GeneratorExit'>, <class 'KeyboardInterrupt'>, <class 'SystemExit'>]
由上可知,异常分类
异常分类
BaseException
所有的异常类的鼻祖,具体的异常类都是继承与鼻祖BaseExecption
GeneratorExit
迭代器退出类,注意是Exit不是StopIteration
,当调用g.close()时才会触发GeneratiorExit的退出
SystemExit
是系统异常退出的类,要注意sys.exit()函数引发的异常,异常不捕获处理,就直接交给Python解释器,解释器退出。
KeyboardInterrupt
是捕获用户中断行为Ctrl+C的退出
centos 7.4默认安装python 2.7, python2.7写的脚本如下
#!/usr/bin/python
#!conding=utf-8
while True:
try:
print 'running'
except KeyboardInterrupt:
print 'exit running'
break
运行结果:
running
running^C
running
exit running
Execption
Execption是所有内建的,非系统退出的异常的基类,自定义异常应该继承自它
重点异常类Execption
Execption是所有内建的,非系统退出的异常的基类,自定义异常应该继承自它。
- SyntaxError语法错误
Python将这种错误也归到异常类下面的Execption下的子类,但是这种错误是不可捕获的
def a():
try:
0a = 5
except:
pass
运行结果:
File "D:/PycharmProjects/untitled1/5moth/512/exec.py", line 3
0a = 5
^
SyntaxError: invalid syntax
- ArithmeticError所有算术计算引发的异常,其子类有除零异常等
LookupError 使用映射的键或序列的索引无效时引发的异常的基类:IndexError,KeyError
自定义异常
从Execption继承的类
class MyException(Exception):
pass
try:
raise MyException()
except MyException:
print('catch the excepion')
运行结果:
catch the excepion
异常的捕获
execpt可以捕获多个异常
class MyException(Exception):
pass
try:
a = 1/0
raise MyException()
except MyException:
print('catch the excepion')
except ZeroDivisionError:
print('1/0')
except Exception:
print('Exception')
捕获规则
- 捕获是从上到下依次比较,如果匹配,则执行匹配的except语句块
- 如果被一个except语句捕获,其他except语句就不会再次捕获了
- 如果没有任何一个except语句捕获,则该异常向外抛出
as子句
被抛出的异常,应该是异常的实例,如何获得这个对象呢?使用as子句
class MyException(Exception):
def __init__(self,code,message):
self.code = code
self.message = message
try:
raise MyException(404,'not found')
except MyException as e:
print('catch the excepion','+++',e.code,'+++',e.message)
except ZeroDivisionError:
print('1/0')
except Exception:
print('Exception')
运行结果:
catch the excepion +++ 404 +++ not found
finally子句
finally功能
f = None
try:
f = open('test')
except FileNotFoundError as e:
print(e.__class__,e.errno,e.strerror)
finally:
print('清理工作')
if f:
f.close()