前言
目标
·异常的概念
·捕获异常
·异常的传递
·抛出 raise 异常
一、异常的概念
·程序在运行时,如果Python解释器 遇到一个错误,会停止程序的执行,并且提示一些错误的信息,这就是异常
·程序停止执行并且提示错误信息 这个动作,我们通常称之为:抛出(raise)异常
(程序开发时,很难将所有的特殊情况 都处理的面面俱到,通过 异常捕获,可以针对突发事件做集中处理,从而保证程序的稳定性和健壮性)
二、捕获异常
2.1 简单的捕获异常的语法
·在程序开发中,如果对某些代码的执行不能确定是否正确,可以增加 try(尝试)来捕获异常
·捕获异常最贱的语法格式
try:
#尝试执行的代码
except:
#出现错误的处理
·try#尝试,下方编写要尝试的代码,不确定是否能够正常执行的代码
·except# 如果不是,下方编写尝试失败的代码
练习:
要求用户输入整数
上面是出现报错的情况
下面是 try 语法:
代码:
try:
num = int(input("请输入一个整数:"))
except:
print("请输入正确的整数")
输出结果:
2.2 错误类型捕获
·在程序执行是,可能会遇到不同类型的异常,并且需要 针对不同的类型异常,做出不同的响应,这个时候,就需要捕获错误类型
·语法如下:
try:
#尝试执行的代码
pass
except 错误类型1:
#针对错误类型1,对应的代码处理
pass
except (错误类型2,错误类型3):
#针对错误类型2和3,对应的代码处理
pass
except exception as result:
print(“未知错误 %s” % result
·当Python解释去抛出异常时,最后一行错误信息的第一个单词,就是错误类型
练习:
需求
- 提示用户输入一个整数
- 使用 8 除以用户输入的整数,并且输出
(这里要注意,一般我们用户可能会输入字母,或者0“0不能做除数”)
首先是除0错误:
代码:
try:
# 提示用户输入一个整数
num = int(input("请输入一个整数:"))
# 使用 8 除以用户输入的整数并且输出
result = 8 / num
print(result)
except ZeroDivisionError:
print("除0错误")
输出结果:
然后是值错误(输入的是字母或者是大写汉字):
正确操作:
代码:
try:
# 提示用户输入一个整数
num = int(input("请输入一个整数:"))
# 使用 8 除以用户输入的整数并且输出
result = 8 / num
print(result)
except ZeroDivisionError:
print("除0错误")
except ValueError:
print("请输入正确的整数")
输出结果:
捕获位置错误
·在开发时,要预判到所有可能出现的错误,还是有一定难度的
·如果希望程序无论出现任何错误,都不会因为Python解释器抛出异常而终止,可以增加一个 except
语法:
except Exception as result:
print(“未知错误 %s” % result)
(提示:这里的result 只是在except 下方使用的变量名,可以随便写,是用来反馈解释器发出来错误信息的)
练习:
这里假设开发时,没有考虑到除0 错误
代码:
try:
# 提示用户输入一个整数
num = int(input("请输入一个整数:"))
# 使用 8 除以用户输入的整数并且输出
result = 8 / num
print(result)
# except ZeroDivisionError:
# print("除0错误")
except ValueError:
print("请输入正确的整数")
# 开发中没有考虑到除0错误
except Exception as result:
print("未知错误 %s" % result)
输出结果:
2.3 异常捕获完整语法
·在实际开发中,为了能够处理复杂的异常情况,完整的异常语法如下:
try:
#尝试执行的代码
pass
except 错误类型1:
#针对错误类型1,对应的代码处理
pass
except (错误类型2,错误类型3):
#针对错误类型2和3,对应的代码处理
pass
except exception as result:
print(“未知错误 %s” % result)
else:
#没有异常才会执行的代码
pass
finally:
# 无论是否异常,都会执行的代码
print(“无论是否有异常,都会执行的代码”)
· else 只有在没有异常时才会执行的代码
· finally 无论是否有异常,都会执行的代码
· 之前一个演练的完整捕获异常代码如下:
代码:
try:
# 提示用户输入一个整数
num = int(input("请输入一个整数:"))
# 使用 8 除以用户输入的整数并且输出
result = 8 / num
print(result)
except ValueError:
print("请输入正确的整数")
except Exception as result:
print("未知错误 %s" % result)
else:
print("尝试成功,没有错误")
finally:
print("无论是否出现错误,都会执行的代码")
print("_" * 20)
输出结果:
1. 当输入整数 1 时
2. 当输入的是 0 时
3. 当输入的是 字母时
三、异常的传递
·异常的传递——当函数/方法 执行 出现异常,会讲一场传递给 函数/方法 的调用一方
·如果传递的主程序,仍然没有异常处理,程序才会终止
提示
·在开发中,可以在主函数中增加 异常捕获
·而在主函数中调用的其他函数,只要出现异常,都会传递到主函数的异常捕获中
·这样就不需要在代码中,增加大量的捕获异常,能够保证代码的整洁
练习:
需求
- 定义函数 demo1() 提示用户输入一个整数并且返回
- 定义函数 demo2() 调用demo1()
- 在主程序中调用demo2()
输出结果:
结论: 我们是输入的字母a ,所以最开始出现错误的是第二行,所以第二行在传递给第六行,第九行,后面两个都没有处理异常,所以系统就报错了
下面就是改进的版本:
代码:
def demo1():
return int(input("请输入整数:"))
def demo2():
return demo1()
# 利用异常的传递性,在主程序捕获异常
try:
print(demo2())
except Exception as result:
print("未知错误 %s " % result)
输出结果:
结论: 只需要在主程序中增加对异常的捕获,就不需要在每一个函数中增加捕获异常的代码了,可以保证我们在开发函数时,专注函数的开发,不用考虑在里面增加异常捕获
四、抛出 raise 异常
4.1 应用场景
·在开发中,除了代码执行出错 Python 解释器会抛出异常以外
·还可以根据应用程序 特有的业务需求 主动抛出异常
·Python 中提供一个 Exception 异常类
·在开发时,如果满足 特有业务需求是,希望拍出异常,可以
- 创建一个 Exception 的对象
- 使用 raise 关键字 抛出 异常对象
需求:
·提示用户 输出密码,如果长度少于 8 ,抛出异常
注意:
- 当前函数 只负责 提示用户输入密码,如果密码长度不正确,需要其他的函数进行额外 处理
- 因此可以抛出异常,由其他需要处理的函数捕获异常
操作:
代码:
def input_password():
# 1.提示用户输入密码
pwd = input("请输入密码:")
# 2.判断密码长度>=8,返回用户输出的密码
if len(pwd) >= 8:
return pwd
# 3.如果<8,主动抛出异常
print("主动抛出异常")
# 1) 创建异常对象-可以使用错误信息字符串作为参数
ex = Exception("密码长度不够")
# 2)主动抛出异常
raise ex
# 提示用户输入密码
try:
print(input_password())
except Exception as result:
print(result)
总结
这一章节最关键的点,还是在于捕捉异常,一定要在主程序中捕获异常,这样比较方便。主动抛出异常的语法还要再多熟悉一下