UnboundLocalError: local variable 'cur' referenced before assignment after call WinDLL
UnboundLocalError: local variable 'cur' referenced before assignment after call WinDLL
请帮助我...我无法解决该问题。该消息是在调用 DLL 函数后发生的。当然DLL的函数和return值都是可以的
错误消息: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()
您只需要看看如果(例如)pymysql.connect
调用抛出异常会发生什么。
在这种情况下,cur
将永远不会被设置为任何内容,但您将在 finally
块中尝试 close()
它。
至于如何修复它,有几种方法。第一个是让你的异常处理多一点 fine-grained 以便 each potentially-excepting 语句有它自己的 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 的影响(全局变量通常是这类问题的原因)。例外的实际文本也很有价值。
请帮助我...我无法解决该问题。该消息是在调用 DLL 函数后发生的。当然DLL的函数和return值都是可以的
错误消息: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()
您只需要看看如果(例如)pymysql.connect
调用抛出异常会发生什么。
在这种情况下,cur
将永远不会被设置为任何内容,但您将在 finally
块中尝试 close()
它。
至于如何修复它,有几种方法。第一个是让你的异常处理多一点 fine-grained 以便 each potentially-excepting 语句有它自己的 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 的影响(全局变量通常是这类问题的原因)。例外的实际文本也很有价值。