异常:程序运行时发生错误的信号
python中的异常种类
在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)取标识,不同的类对象标识不同的异常,一个异常标识一种错误
AttributeError 试图访问一个对象没有的类型,例如foo.x,但foo没有该属性
IOError 输入/输出异常,基本上是打不开文件
ImportError 无法引入模块或包,基本上是路径问题或者名称错误
IndentationError 语法错误,代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有3个元素却要访问x[5]
KeyError 试图访问字典中不存在的键
NameError 使用一个还未赋值的变量,比如a,当程序中未定义变量a
SyntaxError python代码非法,代码不能编译
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
异常处理
1.1 什么是异常处理
编写特定的代码,专门用来捕捉异常(代码与程序逻辑无关,与异常处理有关)
如果捕捉成功则进入另一个处理分支,执行你为其定制的逻辑,使程序不会崩溃。
1.2 如何进行异常处理
python为每一种异常定制了一个类型,然后提供了一种特定的语法结构用来进行 异常处理(if 也可以进行异常处理,只不过对于不同代码段的同一段异常需要重复写多分支的 if,写多了程序可读性就差)
part1:基本语法
try:
被检查的代码块
except 异常类型:
try中一旦检测到异常,就执行这个位置的逻辑
其中,异常类型只能处理指定的异常
part2:万能异常
try:
age = input('>>')
int(age) #主逻辑
except Exception as e:
print('错误===>',e)
part3:多分支
try:
被检查的代码块
except KeyError as e:
try中一旦检测到异常,就执行这个位置的逻辑
except ValueError as e:
print('---->',e)
except Exception as e:
print('出现异常',e)
异常的其他结构
try:
被检查的代码块
except KeyError as e:
try中一旦检测到异常,就执行这个位置的逻辑
except ValueError as e:
print('---->',e)
else:
print('try 内代码块没有异常则执行我,有异常不会执行')
finally:
print('无论异常与否都会执行,通常是进行清理工作')
自定义异常
class YueException(BaseException):
def __init__(self,msg):
self.msg = msg
raise YueException('==>')
断言
#断言,以下两种方法都可以(判断res1 是不是 1,不是抛出异常)
assert res1 == 1
#或者
if res1 != 1:
raise AssertionError
1.3 什么时候用异常处理
try…except 应该尽量少用,因为它本身就是附加给程序的一种异常处理的逻辑,与主要工作没有关系,东西加多会导致代码可读性变差
只有在有些异常无法预知情况下,才应该加上try…except,其他的应该尽量避免