错误
- 语法错误(SyntaxError)
- 逻辑错误
异常
- 语法和逻辑没有问题,程序执行过程中出现未知错误
- 如:除零报错、字典或列表索引超出范围等等
常见系统异常
- 除零错误 ZeroDivisionError
- 名称异常 NameError
- 类型异常 TypeError
- 索引异常 IndexError
- 键异常 KeyError
- 值异常 ValueError
- 属性异常 AttributeError
- 迭代器异常 StopIteration
系统异常类继承树
BaseException–>Exception、SystemExit、GeneratorExit、Keyboardlnterrupt
-
BaseException是所有内建的异常的基类
-
Keyboardlnterrupt:当用户点击中断键 (通常ctrl + C) 时引发
-
GeneratorExit:当调用一种generator的close()方法时引发
-
SystemExit:由sys.exit()函数引发。当它不处理时,Python 解释器退出
-
Exception 是 所有内置的、 非系统退出异常是从该类派生的。
应该从该类派生所有用户定义的异常。
解决异常-预防
添加容错代码
解决异常-捕获
语法
try:
可能会出现异常的代码
except 捕捉的异常类别 as 接收异常的参数:
对应这个异常的代码处理
[可以有多个except重复, 用于捕捉可能的其他异常;
如果针对于多个不同的异常有相同的处理方式, 那么可以将多个异常合并]
else:(可省去)
没出现异常时做的处理
finally:(可省去)
代码块
不管有没有出现异常,都会执行该代码块
注意
- try语句没有捕捉到异常,先执行try代码块,再执行else代码块,最后执行finally代码块
- 如果try捕捉到异常,首先执行except处理错误,再执行finally
- 如果异常名称不确定的,而又想捕捉,那么except 后的捕捉异常类别可直接写Exception
除法运算
def num1(a,b):
res = a / b
print(res)
def num2(a,b):
try:
res = a / b
except ZeroDivisionError as z:
print("错误处理",z)
else:
print(res)
finally:
print("good")
num2(2,1)
运行结果:
2.0
good
num2(2,0)
运行结果:
错误处理 division by zero
good
手动抛出异常
- 通过 raise 语句直接抛出相关类型的异常
- 什么时候应该向外界抛出异常?
- 什么时候应该内部做好容错处理?
def age(age):
if age <= 0 or age > 100:
raise ValueError('赋值错误')
else:
print("设置的age为:",age)
try:
age(500)
except ValueError as v:
print(v)
运行结果:
赋值错误
自定义异常
- 继承与父类:Exception