【发布时间】:2018-01-12 03:32:09
【问题描述】:
我有以下方法来建立与数据库的连接并最终将其拆除。函数看起来像这样
def read_db(self, sql_statement):
conn = pymysql.connect(host=self.h,user=self.u,passwd=self.pw,
db=self.db,port=self.p)
try:
with conn.cursor() as cur:
cur.execute(sql_statement)
doStuffGeneratingException()
except Exception:
cur.rollback()
raise
finally:
conn.close()
现在如果我必须用上下文管理器替换它,我认为它看起来像
@contextmanager
def setup_sql():
conn = pymysql.connect(host=self.h,user=self.u,passwd=self.pw,
db=self.db,port=self.p)
yield conn.cursor()
connection.cursor().close()
self.connection.close()
def read_db(self, sql_statement):
with setup_sql() as cur:
try:
cur.execute(sql_statement)
doStuffGeneratingException()
except:
cur.rollback()
raise
现在我的问题是
- 上下文管理器的上述解释是否正确?
- 如果在
contextmanager中执行pymysql.connect(...)语句时发生错误,将如何处理?它将如何冒泡到调用函数? - 如果
doStuffGeneratingException()在with实现中出现异常会怎样?控件会先到setup_sql执行yield之后的语句吗?
【问题讨论】:
标签: python generator try-except contextmanager