考虑以下两个模块 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