1.异常
1.异常的介绍
当程序无法正常执行的时候,Python就会抛出异常。这个异常会影响程序的执行,会令程序终止。
异常也是Python的对象,表示错误。
2.异常的捕获
当Python的脚本有发生异常的可能时,便需要捕获它,避免程序的终止。
3.语法
try:
正常程序执行此块代码
except:
抛出错误执行此代码块
例如这样
try:
li = [1, 2, 3, 4]
li[4]
except:
print('异常捕获')
# 异常捕获
练习
• 将以下代码进行异常捕获
• 当代码异常时,将ipt赋值为1
ipt = input("请输入:")
ipt = float(ipt)
print(ipt)
代码如下:
try:
ipt = input("请输入:")
ipt = float(ipt)
print(ipt)
except:
ipt = 1
print(ipt)
4.异常类型捕获
但是仅仅使用以上异常捕获,虽然不会报错终止程序。但是无法记录下具体异常种类。如需记录下具体异常种类,则需要捕获该具体异常。
5.语法
try:
pass
except 当前异常对象 as e: # e = 当前异常对象
print(e)
练习
- 捕获以下代码的异常类型并输出
li = [1, 2, 3]
li[3] # IndexError
代码如下
try:
li = [1, 2, 3]
li[3] # IndexError
except IndexError as e:
print(e)
# list index out of range
需要注意的是,该捕获方式仅能捕获IndexError这一类异常。那么实际上,这种细分的异常种类有很多,可以通过其共同父类Exception捕获输出。
try:
li = [1, 2, 3]
li[3] # IndexError
except Exception as e:
print(e)
# list index out of range
但我们并不建议这么做,因为这项功能多数用于系统日志中,我们需要分类异常的时候,还是精确到异常种类的好。
但我们需要知道自己的程序有没有执行成功也可以用这个语法:try-except-else
try:
pass
except Exception as e:
print(e)
else:
pass
try-except-else
• 如果抛出异常执行except内部代码
• 如果程序正常执行else内部代码
try:
li = [1, 2, 3, 4]
li[3]
except IndexError as e:
print(e)
else:
print('执行成功') # 执行成功
最终执行的代码:try-finally
- 不管程序有无发生异常,都将执行finally内部代码。
try:
li = [1, 2, 3 ,4]
li[4]
except IndexError as e:
print(e) # list index out of range
finally:
print('无论程序执行成功与否,都将执行')
# 无论程序执行成功与否,都将执行
6.主动触发异常
在实际开发中,在程序不满足某条件时,通常会主动抛出异常。也就是说我们可以给程序设定一个条件,当程序不满足我们设定的条件时,我们就可以主动触发异常终止程序。
语法:raise Exception()
练习:判断煎饼熟了没,当烹饪时间小于5时,则主动触发没熟异常;否则熟了。
def lieve(t):
if t < 5:
raise Exception('没熟')
try:
lieve(5)
except Exception as e:
print(e)
else:
print('熟了')
7.自定义异常
当需要自定义满足一些规则时,就可以自定义异常。
自定义异常通过创建一个新的异常类,自定义名字与内容,并且需要继承Exception类实现。
class Y(Exception):
def __init__(self, a):
self.a = a
def __str__(self):
return self.a
try:
raise Y('主动触发异常')
except Y as e:
print(e) # 主动触发异常
8.断言
assert断言用于判断一个表达式,当表达式条件为False时触发断言异常AssertionError。
# assert 断言
assert '2' == 2 # AssertionError
注意: 断言用于强制用户服从,可捕获,但是一般不捕获。