赞
赏
在 Python 中,每一个 try 语句后面都可以对应一个或多个 except 语句,同时,每一个 try 语句后面,还可以对应一个 finally 子句,当然,也可以不带 finally 字句,如果带 finally 字句,那么 finally 字句最多只能带一个。
try 字句后面的 finally 子句用来表示,不管前面的代码如何执行了,一定要执行的代码那么我们可以将其放在 finally 子句里,即使是没有触发异常,即没有执行 except 的代码,那么 finally 字句的代码一定也会执行。
try:
# 需要检测异常的代码
finally:
# 一定要执行的语句
try 语句后面可以不接 except 语句,直接加 finally 语句。
try:
# 需要检测异常的代码
except Exception1:
# 处理异常的代码
except Exception2:
# 处理异常的代码
finally:
# 一定要执行的语句
我们在异常捕获时,将一定要执行的代码放在 finally 语句中。
我们在异常处理时,将一定要处理的代码放在 finally 中
if __name__ == '__main__':
print("嗨客网(www.haicoder.net)")
try:
num = input("Please input a number:")
print("Your input is:", int(num))
except Exception:
print("convert to number error")
finally:
print("call finally")
程序运行后,控制台输出如下:
我们在 main 函数里,使用 input 让用户输入,接着,我们将用户输入的 字符串 进行了 强制类型转换,转换成了 int 类型。
因为,我们输入的就是一个数字,因此,这里的转换成功,程序运行正常,没有触发 except 的逻辑,但是,我们看到程序还是执行了 finally 里的逻辑,现在,我们输入一个不是数字的字符串,程序运行后,控制台输出如下:
这次,我们输入的不是数字,而是一个字符串,这次将字符串转换成数字转换失败,因此,程序报出了异常,程序走到了 except 的异常处理代码,同时,也走到了 finally 的执行代码。
因此,我们可以看到不管程序怎么执行,finally 的代码一定会被执行。
我们在异常处理时,将一定要处理的代码放在 finally 中
if __name__ == '__main__':
print("嗨客网(www.haicoder.net)")
try:
fp = open("haicoder.txt")
print("file open succes")
except IOError:
print("file open failed")
finally:
fp.close()
print("file closed")
程序运行后,控制台输出如下:
我们首先使用 open 打开文件,并且将打开文件的代码使用 try 进行异常捕获,最后,使用 finally 关闭文件,这里,因为,我们的文件不存在,因此,此时的 fp 变量 没有初始值,所以在 finally 语句中,没发正确关闭文件。
现在,我们只能使用双重 try 语句,当成功打开文件之后,再次使用 finally 关闭文件,将程序修改如下:
if __name__ == '__main__':
print("嗨客网(www.haicoder.net)")
try:
fp = open("haicoder.txt")
print("file open succes")
try:
content = fp.read()
print("read file =", content)
finally:
print("close file")
fp.close()
except IOError:
print("open file error")
第一个 try,我们捕获文件打开的错误,如果此时文件打开失败,那么就走到 IOError 的异常,因为文件打开失败,所以不需要关闭文件。
这里,我们文件不存在,所以执行到了打开文件失败的异常,现在我们创建文件,再次执行,,控制台输出如下:
此时,我们看到程序正确读取到了文件内容,并且最后在 finally 关闭了文件。
try 字句后面的 finally 子句用来表示,不管前面的代码如何执行了,一定要执行的代码那么我们可以将其放在 finally 子句里,即使是没有触发异常,即没有执行 except 的代码,那么 finally 字句的代码一定也会执行。