目录
一、异常的概念:
常见的异常:
二、异常的捕获:
1.异常捕获的基本语法:
2.捕获指定的异常:
3.捕获多个异常:
三、else,finally子句:
四、异常具有传递性:
异常简单来说就是程序运行过程中出现的错误,也叫BUG。
当出现异常时,程序往往会中断报错甚至直接退出,而在程序的运行中经常会出现不可预料的错误,例如,当用户在app上输入不合规范的数据时,程序会抛出ValueError的错误后闪退,这对用户非常不友好,所以我们往往需要预料到可能会出现的异常,然后做出处理,确保程序不会无缘无故地退出。
下面就对上述例子中的问题进行优化:
try:
#可能出现错误的代码块
except :
#处理异常代码块
try:
print(a) #a未被定义,可能会报NameError
except NameError as e:#将NameError指定一个别名e,方便后续引用
print("变量未被定义",e)
try:
print(a = 1/0) #a未被定义,可能会报NameError
except (NameError,ZeroDivisionError) :#将NameError指定一个别名e,方便后续引用
print("变量未被定义 或 除零错误")
当需捕获全部的错误时,可以直接用Exception代表所有异常,同时,将异常名指定为e,可以同时输出e达到确定错误类型的目的。
try:
print(a) #a未被定义,可能会报NameError
except Exception as e :#将NameError指定一个别名e,方便后续引用
print("出现异常",e)
知道这些处理方法以后,例子中的输入程序可优化为:
while True:
try:
number = int(input("请输入一个数字:"))
except ValueError:
print("您输入的不是有效数字,请重试!")
当判断完毕try中是否有语法错误后,如果想要继续程序怎么办呢?这时候可以用else语句,else语句后面的代码表示如果没有错误就会执行的代码。
不管有没有错误发生,我一定想要执行一段代码怎么办呢?这时候finally子句派上用场了,finally后面的代码表示不管有没有错误都会执行的代码。
a = '试验是否有异常'
try:
print(a) #a未被定义,可能会报NameError
except Exception as e :#将NameError指定一个别名e,方便后续引用
print("出现异常",e)
else:
print("未出现异常,跳转到这里")
finally:
print("不管有没有异常,这句话一定会执行")
当没有错误时,结果如下:
当出现错误时,结果如下:
当异常出现在子程序中时,可以通过主函数中的子函数调用传递到主函数中,使主函数也报错。
测试用例:
def func1():
print("func1开始运行")
1/0
print("func1结束运行")
def func2():
print("func2开始运行")
func1()
print("func2结束运行")
def main():
print("main开始运行")
func2()
print("main结束运行")
main()
运行后发现,func1,func2,main中都有报错,说明func1中的错误通过子函数调用传递到了其他函数段。
通过异常的传递性,我们可以在最顶层的函数(这里是main函数)中对错误进行统一的捕获与处理,而不用在每个子函数中分别处理,优化了代码结构,上述代码中异常处理过程如下:
def func1():
print("func1开始运行")
1/0
print("func1结束运行")
def func2():
print("func2开始运行")
func1()
print("func2结束运行")
def main():
print("main开始运行")
try:
func2()
except Exception as e:
print("出现异常了,异常是",e)
print("main结束运行")
main()