Python3中异常处理:try-finally语句的示例
一. 简介
前面一篇文章简单学习了 try-finally语句结构,执行过程、以及使用场景。文章如下:
Python3中异常处理:try-finally语句-CSDN博客
本文写一些简单的示例来继续学习 try-finally语句的使用。
二. Python3中异常处理:try-finally语句的示例
示例 1:try 块在执行时发生异常后,会立刻停止执行 try块中剩下的代码,转而匹配 except的异常:
#!/usr/bin/env python3def sub_func():try:print("进入try代码块")value = 20 / 0print("这块代码不会执行")finally:print("无论是否发生异常,这块代码都会执行")try:sub_func()
except ZeroDivisionError as err:print(f"{err}: 捕获到 ZeroDivisionError 异常")
运行后结果如下:
可以看出,这是一个嵌套的 try...except语句结构,内部的 try...finally语句块触发了异常,因为内部没有 异常处理 except处理,所以,将该异常抛出到外层的 try...except语句块,打印异常信息。
示例 2:带 except块(异常处理的),还有 else块的(try块执行无异常时会执行的块):
#!/usr/bin/env python3#假如 test.txt文件已存在
file_name = "test.txt"def sub_func(filename):fd = Nonetry:fd = open(filename, 'r')except FileNotFoundError as err:print("Not found file: error:",err)else:print("open file OK.")finally:print("finally code-blocks")if fd:fd.close()#调用 sub_func()函数
sub_func(file_name)
运行后结果如下:
示例 3:避免在 finally块 中触发异常,否则,在 finally块中引发了新的异常,可能会掩盖之前的异常:
#!/usr/bin/env python3#定义sub_func函数
def sub_func():try:raise ValueError("原始异常")finally:raise RuntimeError("新的异常")#外部try--except块
try:sub_func()
except Exception as err:print(err)
raise ValueError("原始异常"): 手动触发了一个 ValueError类型的异常。并附带一条描述性的错误信息。
except Exception as err : 捕获所有继承自 Exception
类的异常。Exception是 Python中大多数内置异常类的基类,因此,这行代码可以捕获几乎所有常见的异常。
运行后结果如下:
wangtian@wangtian-virtual-machine:~/Code_Learns/python_codes$ ./hello.py
新的异常
可以看出,在内部 try异常处理代码块中,try 中手动触发了的一个 ValueError 类型的异常,而由于 finally块中触发了一个 RuntimeError类型的异常,最终把 try块的原来的异常覆盖掉了。所以,尽量不要在 finally块中触发异常。