with-as技术是否适用于cx_Oracle?

时间:2012-06-22 19:02:48

标签: python exception-handling cx-oracle

在python的最新版本中,可以使用with open('abc.txt') as f:之类的东西来保证文件被关闭,即使在下面的(缩进的)代码块中发生异常也是如此。我想知道这种技术是否也适用于cx_Oracle连接对象。例如,如果后续代码块中发生错误,我可以这样做以保证数据库连接关闭:

with cx_Oracle.connect('uname/pwd@schema.db') as conn:
  c = conn.Cursor()
  c.execute("Select * from table1")
  #...etc

目前我可以通过使用try来实现这一目标...除了...最后,但我更喜欢使用...作为技术。

2 个答案:

答案 0 :(得分:7)

答案 1 :(得分:3)

即使Connection对象本身没有(显然它确实如此),只要它提供了.close()方法,就可以使用contextlib.closing轻松制作自己的包装器。

>>> from contextlib import closing
>>> 
>>> class FakeC(object):
...     def close(self):
...         print 'closing!'
...     def execute(self, cmd):
...         print cmd
... 
>>> with closing(FakeC()) as c:
...     c.execute("fred")
...     raise Exception("something went wrong!")
... 
fred
closing!
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
Exception: something went wrong!

其他变化几乎一样容易。

[在“是!”之前写上面的内容。答案已经发布,并决定将其发布。]