UnboundLocalError:在调用WinDLL之后赋值之前引用的局部变量'cur'

时间:2015-12-29 07:09:32

标签: python pymysql

请帮帮我...我无法解决这个问题。该消息是在调用DLL函数后发生的。当然DLL的功能和返回值都可以。

错误消息:UnboundLocalError:分配前引用的局部变量'cur'

源代码。

daDll = windll.LoadLibrary('C:\DLL\DA_PcPos.dll')
...
rtnValue = daDll.da_PcPos(3, req_char, rep_text)

if rtnValue == -1:
   self.QueryData()


def QueryData(self):
        global gsHOST_DB, gsPORT_DB, gsUSER_DB, gsPSWD_DB, gsSCHEMA_DB
        try:
            connDB = pymysql.connect(host=gsHOST_DB, port=int(gsPORT_DB), user=gsUSER_DB, passwd=gsPSWD_DB, db=gsSCHEMA_DB, charset='utf8', use_unicode=True) <- Assignment Error
            cur = connDB.cursor()
            cur.execute(""" SELECT DEPOSIT_DIV_NM
                                 , DEPOSIT_DIV_CD
                              FROM ADM_DEPOSIT_DIV
                             ORDER BY ORDER_SEQ """,)
            rows = cur.fetchall()
            self.cbxPayMethod.Clear()
            for row in rows:
                self.cbxPayMethod.Append(row[0])
        except:
            exception = sys.exc_info()[1]
            wx.MessageBox(exception.args[1], 'error', wx.OK | wx.ICON_INFORMATION)
        finally:
            cur.close()
            connDB.close()

1 个答案:

答案 0 :(得分:0)

如果(例如)pymysql.connect调用抛出异常,您只需要查看会发生什么。

在这种情况下,cur永远不会被设置为任何内容,但您会尝试在close()块中finally

至于如何修复它,有几种方法。第一个是使您的异常处理更细粒度,以便每个潜在异常语句都有自己的catch。这样,你知道什么未能及时清理。

但是,这可能并不理想,因为它可能会大大增加代码的大小。

另一种没有这种缺点的方法依赖于在 try块之前将变量设置为标记值。这样,你知道它们会存在,你可以检查它们的价值。

换句话说,比如:

connDb = None
cur = None
try:
    connDb = ...
    cur = ...
    :
catch:
    :
finally:
    if cur is not None: cur.close()
    if connDb is not None: connDb.close()

如果问题更多地与事先调用DLL时发生异常的事实有关,那么你需要做更多的调查,因为问题中没有足够的信息。

首先,我将检查用于pymysql.connect调用的所有变量,因为它们可能受到DLL的影响(全局变量通常是导致这些问题的原因)。例外的实际文本也很有价值。