目录:
- 什么是异常?
- 为何要进行异常处理
- 如何进行异常处理
- 主动触发异常raise
- 断言
- 自定义异常
什么是异常?
- 异常是错误发生的信号,程序一旦出错,如果程序中还没有相应的处理机制,那么该错误就会产生一个异常抛出来,程序的运行也随之终止
例如:
print('start')
x = 1
y = 2
if
print('end') # 程序一句也不会运行直接报错,运行前会先检测语法
- 1
- 2
- 3
- 4
- 5
异常分为三部分:
- 异常的类型(一个个的类)
- 异常的内容、提示信息
- 异常的追踪/定位信息信息
异常的分类:
-
语法上的错误(如上例)
-
逻辑上的错误
# NameError
age = 12
a
# IndexError
l = [1,2,3]
l[123]
# KeyError
d = {'name':'jason'}
d['password']
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
回到目录
为何要进行异常处理
- 增强程序的健壮性
如何进行异常处理
- 语法:
try
...
except
...
- 1
- 2
- 3
- 4
- 示例:
#针对逻辑上的异常才应该使用try...except去捕捉异常进行处理
#1、异常的单分支(单个except)
#2、异常的多分支(多个except)
#3、万能异常:Exception,可以匹配所有种类的异常(挨个注释挨个尝试)
#4、多分支+Exception,注意Exception一定要放到except 其他异常的的后面
#5、try...else,else会在被检测的代码块没有异常发生的情况下执行, else一定要与except连用,并且一定要放到多个except后面
try:
d = {'name': 'jason'}
d['password']
# a = 1
# x
# l = [1,2,3,4]
# l[123]
print('haha')
pass
except Exception as e:
print(e)
else:
print('当try里面的代码没有报错的情况下走else')
finally:
print('无论前面有没有报错 我都会执行')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
try…finally,finally的代码,无论被检测的代码有无异常,都会执行,通常在finally内做一些回收资源的事情,例如:
try:
f = open('','w',encoding='utf-8')
()
finally:
()
print('other...')
- 1
- 2
- 3
- 4
- 5
- 6
回到目录
主动触发异常raise 异常类型(’异常的内容‘)
- 应用于程序中自定义某种法则,一旦不遵循则会像抛出语法异常一样,终止程序的运行
class People:
def __init__(self,name):
if not isinstance(name,str):
raise TypeError('%s must be str type'%name)
= name
- 1
- 2
- 3
- 4
- 5
断言
- 当assert条件不满足是抛出AssertionError,提示信息
l = [1, 2, 3]
#正常运行
assert len(l) > 2
l = [1, 2]
#报错
assert len(l)>2,"l范围小于三"
- 1
- 2
- 3
- 4
- 5
- 6
自定义异常
class MyError(BaseException):
def __init__(self,msg):
super().__init__()
=msg
def __str__(self):
return '<%s>' %
- 1
- 2
- 3
- 4
- 5
- 6
- raise MyError(‘我自己定义的异常’) # 主动抛出异常其实就是将异常类的对象打印出来,会走__str__方法
回到目录