Python UnboundLocalError:局部变量';cur';调用Windell后在赋值之前引用

Python UnboundLocalError:局部变量';cur';调用Windell后在赋值之前引用,python,pymysql,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

请帮帮我。。。我解决不了那个问题。该消息在调用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()
dadl=windell.LoadLibrary('C:\DLL\DA\u PcPos.DLL')
...
rtnValue=dadell.da_PcPos(3,请求字符,代表文本)
如果RTN值==-1:
self.QueryData()
def查询数据(自身):
全局gsHOST_DB、gsPORT_DB、gsUSER_DB、gsPSWD_DB、gsSCHEMA_DB
尝试:

connDB=pymysql.connect(host=gsHOST\u DB,port=int(gsPORT\u DB),user=gsUSER\u DB,passwd=gsPSWD\u DB,DB=gsSCHEMA\u DB,charset='utf8',use_unicode=True)您只需要看看如果(例如)pymysql.connect调用引发异常会发生什么

在这种情况下,
cur
将永远不会被设置为任何值,但您将尝试在
finally
块中关闭它


至于如何修复,有两种方法。第一种方法是使异常处理更细粒度,以便每个潜在异常语句都有自己的
catch
。这样,你就知道什么东西还没有过时,什么东西需要清理

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

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

换句话说,类似于:

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的影响(全局变量通常是此类问题的原因)。例外情况的实际文本也很有价值。

我知道这一点。但是,若我并没有调用DLL函数,那个么我就并没有错误。@Jason,若你们知道那个问题,你们为什么不考虑它呢?事实上,这些变量可能由于多种原因而无法绑定,因此您应该正确地捕获它。至于为什么(可能)DLL调用会导致异常的问题,这个问题中的信息远远不够。我所能建议的就是你检查通话的所有参数。谢谢你的回复。