【发布时间】:2012-04-29 14:43:54
【问题描述】:
考虑以下两个模块,prog.py 和 err.py。这两个都是一个更大的程序的例子,它表现出这个问题。我需要将功能分成更小的源文件,每个文件都有一个测试台。
Err.py 包含一个测试台。当它创建一个 prog 对象时,取决于异常被调用的方式,异常是否被捕获。
似乎即使 prog.py 在“from err import *”语句中导入了 err 对象,模块名称仍然被推断(错误?),但似乎它所指的 err 与模块不同自己
这是 Python 2.7 中的错误还是预期行为?
只需获取两个文件并运行 err.py 即可了解我的意思..
第一个文件:
#prog.py
from err import *
class prog(object):
def func1(self):
raise MySubError
def func2(self):
doError()
还有第二个文件:
#err.py
import prog
import inspect
import sys
class myError(Exception):
pass
class MySubError(myError):
pass
def doError():
raise MySubError
if __name__=="__main__":
p=prog.prog()
try:
doError()
except MySubError as er:
print type(er)
print "Captured 1"
except Exception as er:
print type(er)
print "Not Captured 1"
try:
p.func1()
except MySubError as er:
print type(er)
print "Captured 2"
except Exception as er:
print type(er)
print "Not captured 2"
try:
p.func2()
except MySubError as er:
print type(er)
print "Captured 3"
except Exception as er:
print type(er)
print "Not captured 3"
在我看来,好像 err 应该知道它是什么模块,并且异常应该是 err.MySubError,而不仅仅是 MySubError。我可以获取模块,但不能获取实例.....
输出:
<class '__main__.MySubError'>
Captured 1
<class 'test.MySubError'>
Not captured 2
<class 'test.MySubError'>
Not captured 3
【问题讨论】: