暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

python异常之try/finally分句

原创 梯阅线条 2023-12-29
313

1 python异常之try/finally分句

不管try语句代码块是否发生异常,finally分句代码块都会执行。

finally分句用于定义任何情况下都必须执行的清理操作,将会在最后执行。

finally分句用于任何需要保证资源释放的场景。

比如,文件操作后的关闭文件,连接数据库后的断开数据库。

1.1 基本用法

try复合语句必须有一个except分句或finally分句,并且编写顺序如下:

try->except->else->finally

用法

格式一

try: 语句代码块 except [type [as value]]: 语句代码块 [except [type [as value]]: 语句代码块]* [else: 语句代码块] [finally: 语句代码块]

格式二

try: 语句代码块 finally: 语句代码块

描述

格式一中,使用else分句前必须有except分句。

不管try是否发生异常,是否被处理finally都会执行,包括如下情况:

(1) try语句代码块发生异常并被处理;

(2) try语句代码块发生异常并没处理;

(3) try语句代码块未发生异常;

(4) except或else处理器中发生或未发生新的异常;

示例

>>> def testfinally(s,i): try: print(s[i]) except IndexError as ie: print('索引错误:',ie) else: print('执行else'+s[i]) finally: print('执行finally') print('执行与try复合语句有相同缩进的代码块') # (1) try语句代码块发生异常并被处理; >>> testfinally('梯阅线条',5) 索引错误: string index out of range 执行finally 执行与try复合语句有相同缩进的代码块 # (2) try语句代码块发生异常并没处理; >>> testfinally(9555,5) 执行finally Traceback (most recent call last): File "<pyshell#23>", line 1, in <module> testfinally(9555,5) File "<pyshell#21>", line 3, in testfinally print(s[i]) TypeError: 'int' object is not subscriptable # (3) try语句代码块未发生异常 >>> testfinally('梯阅线条',1) 阅 执行else阅 执行finally 执行与try复合语句有相同缩进的代码块 # (4) except或else处理器中发生或未发生新的异常; >>> testfinally([1,2,3],1) 2 执行finally Traceback (most recent call last): File "<pyshell#25>", line 1, in <module> testfinally([1,2,3],1) File "<pyshell#21>", line 7, in testfinally print('执行else'+s[i]) TypeError: can only concatenate str (not "int") to str

1.2 finally使用举例

1.2.1 关闭文件

描述

对文件操作后,不管失败成功,最后都要关闭文件,在finally分句编写对应代码。

示例

>>> def testfinally(filepath): try: f=open(filepath) except FileNotFoundError as fnfe: print('打开文件失败:',fnfe) except Exception as e: print(e) else: content=f.read() print(content) finally: print('执行finally') f.close() >>> testfinally(r'E:\documents\F盘\hello.txt') hello!python! 执行finally

1.2.2 关闭数据库

描述

对数据库操作后,不管失败成功,最后都要关闭连接,在finally分句编写对应代码。

示例

>>> def testfinally(): import pymysql conn = None try: conn = pymysql.connect(host="localhost", user="user", password="password", database="test") cur = conn.cursor() except pymysql.MySQLError as mse: print("连接数据库失败:", mse) except Exception as e: print("连接数据库失败:", e) else: cur.execute("SELECT * FROM users") rows = cur.fetchall() for row in rows: print(row) finally: print('执行finally') if conn: conn.close() >>> testfinally() 连接数据库失败: (2003, "Can't connect to MySQL server on 'localhost' ([WinError 10061] 由于目标计算机积极拒绝,无法连接。)") 执行finally

2 END

本文首发微信公众号:梯阅线条

更多内容参考python知识分享或软件测试开发目录。

文章转载自梯阅线条,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论