主要针对以下几个问题:
- 为什么捕获异常?
- 什么是抛出异常?
- 错误类型捕获;
- 捕获未知类型;
- 捕获异常完整语法;
- 异常的传递;
- 主动抛出异常。
为什么捕获异常
平常编译代码时出现中断,可能想着有着bug,但是如果是一个产品呢,在使用产品的时候,突然一个中断,这不是能经常用网络问题来解释的,捕获异常是为了程序的稳定性和健壮性。
什么是抛出异常
程序停止执行并且提示错误信息 这个动作,我们通常称之为:抛出(raise)异常。
错误类型捕获
当 Python 解释器 抛出异常 时,最后一行错误信息的第一个单词,就是错误类型,以下代码即是输入值可能为字符串或是0时的错误类型捕获。
不能确定正确执行的代码放在try后,错误的处理代码放在except后。
try:
num = int(input("请输入整数:"))
result = 8 / num print(result)
except ValueError:
print("请输入正确的整数")
except ZeroDivisionError:
print("除 0 错误")
捕获未知类型
在实际应用中,可能会由于复杂性不能完备的想出全部的异常情况。如果希望程序无论出现任何错误,都不会因为 Python 解释器 抛出异常而被终止,可以再增加一行:
except Exception as result:
print("未知错误 %s" % result)
捕获异常完整语法
num = 1
# num = 0 # 会出现除0错误
# num = 'a'
try:
result = 8 / num
except ZeroDivisionError:
result = 0
print("除 0 错误")
except Exception as result:
print("未知错误 %s" % result)
else:
result = 2
print("正常执行")
finally:
print("执行完成,但是不保证正确")
print(result)
执行结果说明
正常执行:try->else->finally
运行结果为:
出现除 0 错误:try->except ZeroDivisionError->finally
运行结果为:
出现未知错误:
异常的传递
- 在开发中,可以在主函数中增加异常捕获
- 而在主函数中调用的其他函数,只要出现异常,都会传递到主函数的 异常捕获 中
- 这样就不需要在代码中,增加大量的 异常捕获,能够保证代码的整洁
主动抛出异常
需求
- 定义 input_password 函数,提示用户输入密码
- 如果用户输入长度 < 8,抛出异常
- 如果用户输入长度 >=8,返回输入的密码
代码
def input_password():
pwd = input("请输入密码:")
if len(pwd) >= 8:
return pwd
ex = Exception("密码长度不够")
raise ex
try:
user_pwd = input_password()
print(user_pwd)
except Exception as result:
print("发现错误:%s" % result)