在我的工作中,有一个使用的Python 2.5应用程序,它是用py2exe编译的,然后分发给用户。由于迁移到新数据库,我的任务是更新应用程序。不幸的是,我们不再拥有原始源代码。 (尽管我们确实拥有从该代码库派生的其他项目的来源。)
幸运的是,我确实可以访问位于.pyc
的已编译library.zip
文件。找到.pyc
文件后,我导入了它,仔细阅读了它的文档,并测试了它的行为。结合我有更高版本的源代码这一事实,我相信我能很好地处理.pyc
文件中的内容。
所以现在我从.pyc
删除了旧的library.zip
文件,并在我的新版本中添加了回来。它主要起作用。
如果提供了正确的输入,旧程序会成功调用library.zip
中的新代码,并且行为就像以前一样。但是,旧代码不会捕获任何新代码的异常。我在解释器中打开了两个模块并比较了异常,它们看起来完全相同(相同的类名,甚至是相同的错误字符串)。
所以我的问题是,我从哪里开始?我怀疑即使我看不出异常之间的任何差异,但关于它们的一些东西必须是不同的。我该如何进一步测试?还有什么我可能会遗失?
答案 0 :(得分:2)
旧的和新的异常具有相同的名称,但它们似乎是生活在不同模块中的不同对象。至少,在这种情况下,您将获得您描述的行为。解决方案:尝试从每个剩余的.pyc
文件中导入例外。当您找到它们时,将它们导入替换代码并提升它们而不是替换代码。
演示问题:函数调用引发module2.myException
,但调用者期望module1.myException
。我不能肯定地说这是你的问题,但如果不是,那应该是: - )
---- module1.pyc --- (Old: no source code)
class myException(Exception):
pass
---- module2.py --- (New: Your replacement for the old module2.py)
class myException(Exception):
pass
def myfunction():
raise myException()
---- mainmodule.pyc --- (Old: no source code)
from oldmodule1 import myException
import module2
try:
module2.myfunction()
except myException:
print "Caught it!"