本菜鸟在用flask后台开发的时候经常会遇到异常管理机制的问题,例如登陆密码不匹配,没有输入等等。借此来学习一下python的异常管理机制。
Python的异常处理能力是很强大的,可向用户准确反馈出错信息。在Python中,异常也是对象,可对它进行操作。所有异常都是基类Exception的成员。所有异常都从基类Exception继承,而且都在exceptions模块中定义。Python自动将所有异常名称放在内建命名空间中,所以程序不必导入exceptions模块即可使用异常。一旦引发而且没有捕捉SystemExit异常,程序执行就会终止。如果交互式会话遇到一个未被捕捉的SystemExit异常,会话就会终止。
1、try...except
try...except...finally这是我用得比较多的语句,python先执行try下的语句如果遇到错误就执行except下的语句,最后假如有finally语句的话,无论正确与否都得执行。说明:每个try语句都必须有至少一个except语句。如果有一个异常程序没有处理,那么Python将调用默认的处理器处理,并终止程序且给出提示。在except中还可以捕捉特定的错误,利用excepy...as语句即可。在这里值得注意的是在python2.x版本中捕捉错误是 except IOError ,e ,,而3.x版本则是except as e。except具体用法如下:
except: #捕获所有异常
except: <异常名>: #捕获指定异常
except:<异常名1,异常名2):捕获异常1或者异常2
except:<异常名>,<数据>:捕获指定异常及其附加的数据
except:<异常名1,异常名2>:<数据>:捕获异常名1或者异常名2,及附加的数据库
异常名AttributeError 调用不存在的方法引发的异常
EOFError
ImportError 导入模块出错引发的异常
IndexError
IOError
KeyError
NameError 使用不存在的变量名引发的异常
TabError 语句块缩进不正确引发的异常
ValueError 搜索列表中不存在的值引发的异常
ZeroDivisionError
try:
p = int(page_str)
except ValueError as e:
pass
2、raise
形式如下:
raise <name> #manually trigger an exception #raise 异常名
raise<name>,<value> #pass extra data to catcher too #异常名,附加数据
raise #re-raise the most recent excepti #类名
if not email:
raise APIValueError('email', 'Invalid email.')
3、assert
assert 简化了raise语句:
需要注意的是,assert语句一般用于开发时对程序条件的验证,只有当内置_debug_为True时,assert语句才有效。当Python脚本以-O选项编译成为字节码文件时,assert 语句将被移除。
但与raise语句不同的是,assert语句是在条件测试为假时,才引发异常。assert语言的一般形式如下:
assert <条件测试>,<异常附加数据> #其中异常附加数据是可选的