当程序遇到问题时不让程序结束,而通过错误继续向下执行。
概述
作用
用来检测try语句块中的错误,从而让except语句捕获错误信号并处理
格式
try:
处理语句
except 错误类型 as e:
错误1执行语句
except 错误类型 as e:
错误2执行语句
.....
except 错误类型 as e:
错误n执行语句
else:
语句
注意:else语句可有可无
逻辑
当程序执行到try-except-else语句时:
1.如果当try“处理语句”执行出现错误,会匹配第一个错误类型,
如果匹配上就执行对应“语句”
2.如果当try“处理语句”执行出现错误,没有匹配的异常类型,
错误将会被提交到上一层的try语句;或者到程序的最上层。
3.如果设置else了当try“处理语句”执行没有出现错误,执行else下的“语句。
简单的异常处理
使用except而不是用任何错误类型
示例如下:
try:
# 一个未定义的变量
name
except:
print('程序出现错误!')
# 执行结果
# 程序出现错误!
判断错误类型处理
通过数值类型的1加字符串类型的1111,因为try-except程序没有抛出异常并终止操作;
而是检测到错误类型给出相应提示并继续执行。
示例如下:
try:
print(1 + '1111')
except NameError as e:
print('名称未定义:', e)
except TypeError as e:
print('类型错误:', e)
print('------- END -------')
# 执行结果
# 类型错误: unsupported operand type(s) for +: 'int' and 'str'
# ------- END -------
并行检测多种异常
还可以使用except并行检测多中异常,如下对名称错误和类型错误进行相同处理。
示例如下:
try:
print(1 + '1111')
except (NameError, TypeError) as e:
print('名称错误 or 类型错误:', e)
print('------- END -------')
# 执行结果
# 名称错误 or 类型错误: unsupported operand type(s) for +: 'int' and 'str'
# ------- END -------
使用else
else可根据情况添加,可用于设置依赖上面处理成功才可执行的操作;
如果上面执行出错,则不会执行else内容。
示例如下:
try:
num = 1
except (NameError, TypeError) as e:
print('名称错误 or 类型错误:', e)
else:
num += 1
print('代码执行成功', num)
# 执行结果
# 代码执行成功 2
使用基础异常类
错误其实是class(类),所有的错误都是继承自BaseException,
所以可以使用它捕获所有类型(包括子类)的错误。
示例如下:
try:
print(1 + '1111')
except BaseException as e:
print('基类异常捕获:', e)
except TypeError as e:
print('类型错误:', e)
print('------- END -------')
# 执行结果
# 基类异常捕获: unsupported operand type(s) for +: 'int' and 'str'
# ------- END -------
跨越多层调用
在main中调用fun2,fun2方法中调用fun1。但只是在main方法中进行捕获错误,
也可以捕获到调用fun1产生的错误。
示例如下:
def fun1(num):
print(1 / num)
def fun2(num):
fun1(num)
def main():
fun2(0)
try:
main()
except ZeroDivisionError as e:
print('出现了错误')
# 执行结果
# 出现了错误
断言
断言也就是assert 语句,通常用于检查用户的输入是否符合规定,还经常用作程序初期测试和调试过程中的辅助工具;当出现设置的断言时,程序会抛出相应设置错误,这有利于对程序进行拍错,提高程序的健壮性。
示例如下:
def get_student(name):
assert (type(name) == str), 'name 必须为字符串类型'
print(name)
get_student(11)
当结果为True时,程序继续执行;否则抛出设置错误。
结果如下:
Traceback (most recent call last):
File "E:\lianxipy\day3\异常处理.py", line 88, in <module>
get_student(11)
File "E:\lianxipy\day3\异常处理.py", line 83, in get_student
assert (type(name) == str), 'name 必须为字符串类型'
AssertionError: name 必须为字符串类型
finally
格式:try-except-finally
作用:finally中的语句无论是否有错误都将执行。
示例如下:
try:
num
except NameError as e:
print('名称错误:', e)
except TypeError as e:
print('类型错误:', e)
finally:
print('必须执行语句')
# 执行结果
# 名称错误: name 'num' is not defined
# 必须执行语句
标准异常列表
异常名称 | 描述 |
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
Exception | 常规错误的基类 |
StopIteration | 迭代器没有更多的值 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点计算错误 |
OverflowError | 数值运算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
WindowsError | 系统调用失败 |
ImportError | 导入模块/对象失败 |
LookupError | 无效数据查询的基类 |
IndexError | 序列中没有此索引(index) |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
NameError | 未声明/初始化对象 (没有属性) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError | Python 语法错误 |
IndentationError | 缩进错误 |
TabError | Tab 和空格混用 |
SystemError | 一般的解释器系统错误 |
TypeError | 对类型无效的操作 |
ValueError | 传入无效的参数 |
UnicodeError | Unicode 相关的错误 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |
总结
异常处理在python 功能开发中应用很广泛,当出现错误后,用于保存错误原因和调试功能很方便。