异常 --- 程序执行时产生的事件,为Python对象
《Python学习手册》笔记
异常总是通过实例对象来识别
默认的异常处理器 --- 打印标准出错信息(包括引发的异常和堆栈跟踪-异常发生时的程序行和函数清单。)
堆栈跟踪:从旧到新的顺序列出异常
异常作用:
- 错误处理
- 事件通知
- 特殊情况处理
- 终止行为
- 非常规控制流程
except 捕捉异常 --- 语句定义异常处理方法(异常处理器),如果异常无法捕捉进行上层的传递
(except:)可以捕捉任何异常
else 执行没有异常发生时的行为
raise <Class or Instance>引发异常 --- <class #调用不带构造参数的类 ==> Class()>
当不包括异常名称或数值时,表示重新引发当前异常,一般在exception语句中
raise exception from otherexception --- 附加otherexception到引发异常exception的__cause__属性
finally 终止行为 --- 先执行finally代码,再传递异常
assert raise语句的简写
assert <test>, <data> 如果test为假,引发AssertionError异常,异常说明内容为data
try:
pass
#raise <class or instance>
except <name1>,<name2>,...:
<statements>
except <names>:
<statements>
else:
<statements>
finally:
类异常优点:
- 提供类型分类,便于以后修改;
- 附加状态信息;
- 支持继承;
- 超类可以捕捉子类异常;
BaseException(内置异常超类) -> (Exception) -> 异常类
sys.exc_info --- 抓取最近发生异常的方式
当无异常时返回元组(None, None, None);
当有异常时返回元组(type-异常类型, value-异常类实例, traceback-堆栈跟踪traceback对象)
内置Exception类可以看做:
- 内置变量名
- buildin模块内置名称
- 标准库模块exceptions属性
BaseException --- 异常顶级根类
Exception --- 与应用相关异常的顶层根超类(除了SystemExit,KeyboardInterrupt,GeneratorExit外)
ArithmeticError --- 所有数值错误超类
OverflowError --- 识别特定的数值错误的子类
定制打印显示 --- Exception('显示内容')
定制数据和行为 --- 同类的定制,except Exception as X: X.属性进行访问
提供异常细节和异常方法 --- 提供状态信息,通过定制类的属性和行为
异常设计:
- 嵌套异常处理器,语法嵌套,实现复杂控制;
- 异常不总是错误,如input函数文件结尾EOFError;
- 函数信号条件,当满足条件时引发异常,用以表达结果信号;
- 特殊代码块的终止操作,如文件/服务器连接;
- try外调试,使用sys.exc_info()读取最近发生异常;
- 利用try/except:/else进行进程测试;
设计注意:
- try包装内容;
- 避免捕捉太多或过少;