谁在抛出(和捕获)这个MySQL异常?

8
我正在使用Python与MySQL和Django。我一直看到这个错误,但是我无法确定异常抛出的位置:
```Exception _mysql_exceptions.ProgrammingError: (2014, "Commands out of sync; you can't run this command now") in > ignored```
我的代码中有许多“try”和“exception”块--如果异常发生在其中之一,那么我就会看到自己的调试消息。显然某处捕获了上述异常,因为当异常被抛出时,我的程序没有中止。
我很困惑,能否有人帮忙解决?
5个回答

8
我曾经遇到过这个错误(使用MySQLdb和Django),后来发现它被“忽略”的原因是它出现在一个__del__方法中。 __del__中的异常会被彻底忽略: object.__del__ datamodel 似乎没有任何方法可以从堆栈更高的位置捕获它(至少根据这个线程),但您可以编辑MySQLdb/cursors.py或monkey-patch,在其中获取自己的__del__以捕获异常并将其降级为pdb提示或记录完整的回溯。

你能否确定导致错误的具体代码吗?我想知道是不是使用 Django 中的 MySQL,一个常见的模块,或者是我的特定代码存在问题。 - Mark Chackerian
1
根本问题完全是我的错(在线程之间共享数据库连接),异常发生在关闭连接时,试图刷新结果集。Django在这件事上唯一的责任就是像往常一样,在任何意外情况下都无法进行调试。 - Mu Mind
兄弟你真是救星啊。我一直在尝试调试,因为我在创建表之前使用了DROP TABLE语句,但是我失去了理智,我没有在同一个连接上进行线程处理,什么都没有。 - Milan Velebit

3

1
谢谢提供链接。我没有使用任何显式的MySQL查询或使用任何游标对象。我所有的查询都通过Django对象进行。对我来说一个大问题是无法看到这个异常被抛出的位置。 - Shlomo Shmai
继续:就像在php中一样,如果不关闭第一个mysql连接,您无法打开第二个连接! - Diego Favero

2

我认为如果您从多个线程使用相同的连接/游标,则可能会出现此错误。但是,我不认为Django的创建者会犯这样的错误,但如果您自己做一些事情,很容易发生这种情况。


我的程序中没有多线程,而且只有一个实例正在运行。当我的程序正在运行时,我应该是唯一访问数据库的人。是否有任何调试技术可以查看异常抛出的位置?我将我的程序设置为在大数据集上运行。如果我只测试小数据子集,则一切正常。但是,当我将其设置为在整个集合上运行时,出现了MySQL异常...现在,我正在运行整个集合并将标准输入和标准错误同时输出,以便看到问题出现的更好的位置。 - Shlomo Shmai

2
在打印出一堆东西并调试后,我想我找到了问题所在。我使用的库之一没有关闭连接或游标。但是,只有在迭代大量数据时才会出现这个问题。该问题也非常间歇性,我仍然不知道谁抛出了“命令不同步”异常。但是现在我们关闭了连接和游标,我就不再看到错误了。

0
对象析构函数(__del__)中的异常被忽略,这是此消息所指示的。如果您执行某些MySQL命令而不从游标中获取结果(例如'create procedure'或'insert'),则直到游标被销毁之前,异常才会被忽略。
如果您想引发并捕获异常,请在超出范围之前显式调用cursor.close()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接