文章目录
一、异常的概述
1、概述
在python中有两类错误会引发异常,一类是语法错误比如异常的锁进,异常的函数名称等;还有一类就是逻辑错误,比如1/0,0由于0是无法当作除数的,所以也会抛出异常。
而当程序的某个环节出现异常时,则会导致整个程序崩溃中止。
2、异常的种类
python中一切皆对象,因此异常也是由类产生,所有异常类的基类都是BaseException
以下是常见的类的种类:
- AssertionError:当 assert 关键字后的条件为假时,程序运行会停止并抛出 AssertionError 异常,assert关键字接下去会谈到
- AttributeError:当试图访问的对象属性不存在时抛出的异常
- IndexError:索引超出序列范围会引发此异常
- KeyError:字典中查找一个不存在的关键字时引发此异常
- NameError:尝试访问一个未声明的变量时,引发此异常
- TypeError:不同类型数据之间的无效操作
- ZeroDivisionError:除法运算中除数为 0 引发此异常
- Exception:可以捕捉任何异常
二、异常捕捉语法
1、try…except
在try代码块中包裹的代码出现异常的时候,就会被except捕捉执行except代码块中的代码。异常处理完毕后会继续运行try代码块后面的代码。
示例中Exception可以捕捉任何异常,也可以替换成相应的异常类,如果except没有捕捉到异常,则代码正常向后运行
mystr = 'base'
try:
int(mystr)
except Exception as e:
print(e)
print("主逻辑")
###执行结果
invalid literal for int() with base 10: 'base'
主逻辑
2、try…except…else
else代码快中的内容是当没有出现异常的时候会执行的代码
mystr = '111'
try:
int(mystr)
except Exception as e:
print(e)
else:
print("若代码没有异常则执行")
print("主逻辑")
###执行结果
若代码没有异常则执行
主逻辑
3、finally
finally中的代码是无论出现异常与否都会执行的代码
mystr = '111'
try:
int(mystr)
except Exception as e:
print(e)
else:
print("若代码没有异常则执行")
finally:
print("代码无论是否有异常都会执行")
print("主逻辑")
### 执行结果
若代码没有异常则执行
代码无论是否有异常都会执行
主逻辑
4、自定义抛出异常
4.1、在程序某处主动抛出异常
for i in range(10):
if i == 3:
raise ValueError("值为3,退出")
else:
print(i)
###
0
1
2
Traceback (most recent call last):
File "/Users/huyinjie/PycharmProjects/study/linetest.py", line 3, in <module>
raise ValueError("值为3,退出")
ValueError: 值为3,退出
4.2、自定义异常
class MyError(BaseException):
def __init__(self,msg):
self.msg = msg
for i in range(5):
if i == 3:
raise MyError("抛出自定义异常")
else:
print(i)
5、断言 assert
断言会判断后面表达式的值,若为真,则继续执行;若为假则会抛出AssertionError异常。
assert expression[, arguments]
#这个if判断和assert语法等价
if not expression:
raise AssertionError(arguments)
>>> assert 1==1 # 条件为 true 正常执行
>>> assert 1==2 # 条件为 false 触发异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
def myres(name):
if name == 'hyj':
res = 1
else:
res = 0
return res
res = myres('yang')
assert res==1,'验证不同过'
print("验证通过")
###执行结果
Traceback (most recent call last):
File "/Users/huyinjie/PycharmProjects/study/linetest.py", line 9, in <module>
assert res==1,'验证不同过'
AssertionError: 验证不同过