比如:
def f1(): cOnn= mysql.conn(host='12') try: pass finally: conn.close() def f2(): try: cOnn= mysql.conn(host='12') pass finally: conn.close() def f3(): try: cOnn= mysql.conn(host='12') pass finally: if conn: conn.close()
注意,这里的 conn 可能会出现错误。
我认为应该像 f3 那样写,
那么是不是需要在 try 的外面初始化下 conn
类似的还有多线程编程里获取一个锁,释放一个锁操作, try 外还是 try 内哪个好?
谢。
1 phx13ye 2016-09-08 10:35:14 +08:00 是的,还可以用 with |
![]() | 2 scipio 2016-09-08 11:34:24 +08:00 如果是数据库连接这样的,建议用 with 。 |
![]() | 3 lcj2class 2016-09-08 11:49:40 +08:00 connector-python 是这么做的: ``` try: cnx = mysql.connector.connect(user='scott', database='testt') except mysql.connector.Error as err: print(err) else: cnx.close() ``` connect 肯定是在 try 内获取的 |
![]() | 4 suueyoung 2016-09-08 13:57:38 +08:00 |
![]() | 5 wizardforcel 2016-09-08 14:15:14 +08:00 via Android 锁的话必然是 f1 。 实际上 java 的 sync 语句反编译之后你会发现,它 monitor-enter 是在 try 前面, monitor-exit 是在 finally 里面。 |
![]() | 6 JhOOOn OP @phx13ye 谢谢 @lcj2class 这里我理解 try 语句里就只有 connection 操作, 其他操作放到 else 中是吗? @wizardforcel 多谢, 这里为什么锁放在 try 外面呢?不是很理解,如果放在 try 里面会出现什么问题呢? |
![]() | 7 wizardforcel 2016-09-08 14:54:05 +08:00 via Android |
![]() | 8 lcj2class 2016-09-08 22:55:03 +08:00 想了想,用 else 的方式也不是很好,还是用 f1 的方式好些。具体可以参考: http://stackoverflow.com/a/2837877/2163429 |
9 TaMud 2016-09-09 01:02:46 +08:00 if conn is not None: conn.close() |