根据B站 “黑马程序员” 的python教程记录笔记。
一、基本了解
看了标题之后可能会有疑惑:什么是捕获异常?为什么要捕获异常呢?
# 如果在开发中,对某些代码的执行不能确定是否正确,可以增加 try(尝试) 来 捕获异常 # 捕获异常最简单的语法格式: try: 尝试执行的代码 except: 出现错误的代码
可能这样说还不够直观,那么我们通过一个实例来深入了解:
# 演练 -- 要求用户输入整数
# num = int(input("请输入一个整数:")) - 若用户输入一个字母则会报错
try:
# 不能确定正确执行的代码
num = int(input("请输入一个整数\n"))
except:
# 对于错误的处理代码
print("请输入正确的整数")
print("-" * 20)
运行结果:
二、捕获错误的类型
捕获异常可以捕获不止一个异常状况,对于没有想到的可能发生的错误也可以返回“未知错误”,并且可以返回错误的类型。
针对 不同类型的异常,做出不同的响应,这时需要捕获错误类型 语法: try: 尝试执行的代码 pass except 错误类型1: 针对错误类型1,对应的代码处理 pass except (错误类型2,错误类型3): 针对错误类型2 和 3,对应的代码处理 pass except Exception as result: print("未知错误 %s" % result) 捕获未知错误:开发时,要预判到所有可能出现的错误,是有一定难度的 如果希望程序无论出现任何错误,都不会因为 python 解释器抛出异常而被终止,可以再增加一个 except 当 python解释器抛出异常时,最后一行错误信息的第一个单词,就是错误类型
让我们通过实例加深理解:
try:
num = int(input("输入一个整数:")) # 输入可能为字母
result = 8 / num # 除数不能为0
print(result)
except ZeroDivisionError:
print("除0错误,输入的数不能为0")
except ValueError:
print("值错误,请输入正确的整数")
运行结果:
输入0时:
输入一个字母时:
若没有想到有除0错误这个情况,又添加了未知错误的捕获:
try:
num = int(input("输入一个整数:")) # 输入可能为字母
result = 8 / num # 除数不能为0
print(result)
# except ZeroDivisionError:
# print("除0错误,输入的数不能为0")
except ValueError:
print("值错误,请输入正确的整数")
except Exception as result:
print("未知错误 %s" % result)
输入0时的结果:
三、异常捕获的完整语法
基本的语法我们都知道了,现在来看看在一般情况下通用的完整语法是什么。
语法: try: 尝试执行的代码 pass except 错误类型1: 针对错误类型1,对应的代码处理 pass except (错误类型2,错误类型3): 针对错误类型2 和 3,对应的代码处理 pass except Exception as result: 打印错误信息 print("未知错误 %s" % result) else: 没有异常才会执行的代码 pass finally: 无论是否有异常,都会执行的代码 print("无论是否有异常,都会执行的代码")
还是通过一个实例来加深理解:
try:
num = int(input("输入一个整数:")) # 输入可能为字母
result = 8 / num # 除数不能为0
print(result)
# except ZeroDivisionError:
# print("除0错误,输入的数不能为0")
except ValueError:
print("值错误,请输入正确的整数")
except Exception as result:
print("未知错误 %s" % result)
else:
print("尝试成功")
finally:
print("无论是否有异常,都会执行的代码")
运行结果:
输入字母:
输入0:
输入数字:
四、异常的传递
可能有人会问:我们都学会了怎么捕获异常,还要学什么异常的传递呢?
当然是因为它有用啦!
异常的传递--当函数/方法执行出现异常,会 将异常传递 给 函数/方法 的 调用一方 如果传递到主程序,仍然没有异常处理,程序才会被终止
说了这么多, 那到底好用在哪里呢?让我们接着往下看:
在开发中,可以在主函数中增加异常捕获 而在主数中调用的其他函数,只要出现异常,都会传递到主函数的 异常捕获 中 这样就不需要在代码中,增加大量的 异常捕获,能够保证代码的整洁
老样子,还是通过一个实例来加深理解:
# 需求:
# 1.定义函数 demo1() 提示用户输入一个整数并且返回
# 2.定义函数 demo2() 调用 demo1()
# 3.在主程序中调用 demo2()
def demo1():
return int(input("输入整数:"))
def demo2():
return demo1()
try:
print(demo2())
except Exception as result:
print("未知错误 %s" % result)
运行结果:
当不进行异常捕获的时候,可以从python的报错中看出传递顺序:
五、应用
最后让我们来看看在什么场景中可以应用到这个知识吧!
# 在开发中,除了代码执行出错Python解释器会抛出异常之外 # 还可以根据应用程序特有的业务需求主动抛出异常
# 示例
# 提示用户 输入密码,如果 长度少于 8,抛出 异常
# 注意
# 当前函数 只负责 提示用户输入密码,如果 密码长度不正确,需要其他的函数进行额外处理
# 因此可以 抛出异常,由其他需要处理的函数 捕获异常
# 抛出异常
# Python 中提供了一个 Exception 异常类
# 在开发时,如果满足 特定业务需求时,希望 抛出异常,可以:
# 1.创建 一个 Exception的 对象
# 2.使用 raise 关键字 抛出 异常对象
# 需求
# 定义 inputpassword 函数,提示用户输入密码
# 如果用户输入长度 <8,抛出异常
# 如果用户输入长度 >=8,返回输入的密码
def input_password():
# 提示用户输入密码
pwd = input("请输入密码:")
# 判断密码长度 >= 8,返回用户输入的密码
if len(pwd) >= 8:
return pwd
# 如果 < 8,主动抛出异常
print("主动抛出异常")
# 1.创建异常对象 - 可以使用错误信息字符串进行使用
ex = Exception("密码长度不够")
# 2.主动抛出异常
raise ex
# 提示用户输入密码
try:
print(input_password())
except Exception as result:
print(result)
运行结果:
密码长度不够时:
输入的密码满足条件时:
今天的学习就到这里啦!如有错误敬请指正。