异常是错误发生的信号
一、异常分为三部分
1、异常的追踪信息
2、异常的类型
3、异常的值
二、异常的分类
1、语法异常
这类异常应该在程序执行前就改正
2、逻辑异常
AttributeError 试图访问一个对象没有的属性
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误的子类;代码没有正确对齐
IndexError 下标索引超出序列边界
KeyError 试图访问字典里不存在的键
KeyboardInterrupt ctrl+c被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError 代码非法,代码不能编译
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上与由于另有一个同名的全局变量,导致你以为你正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
三、异常处理
如果错误发生的条件是可预知的,可用if判断处理,在错误发生前进行预防;
如果错误发生的条件是不可预知的,则需要用到try...except...,在错误发生之后进行处理
基本语法:
try:
代码块
except 异常类型:
代码块
try语句按照如下方式工作:
1、首先执行try子句(在关键字和关键字except之间的语句)
2、如果没有异常发生,忽略except子句,try子句执行后结束
3、如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和except之后的名称相符,那么对应的except子句将被执行。最后执行try语句之后的代码
4、如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中
一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
处理程序将只针对对应的try子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。
一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组
万能异常处理:
try:
代码块
except Exception as 别名 #把异常的值赋值给一个别名
代码块
try...else...
else不能单独使用,必须与except连用,意思是else的子代码块会在没有任何异常的情况下执行
try...finally
无论有没有异常发生都会执行,用在回收系统资源的时候
主动触发异常:
raise
断言:
assert
自定义异常
通过创建一个新的exception类来拥有自己的异常。异常应该继承自Exception类