所以我遇到了一个问题:try:except:机制似乎在python中没有正常工作。
以下是我的两个文件的内容。
import pytest2
class MyError( Exception ):
def __init__( self, value ):
self.value = value
def __str__( self ):
return repr( self.value )
def func1():
raise MyError( 'This is an error' )
def func3():
pytest2.func2()
if __name__ == '__main__':
try:
func3()
except MyError, e:
print 'I should catch here.'
except:
print 'Why caught here?'
from pytest1 import func1
def func2():
func1()
执行第一个文件会产生以下输出:
$ python pytest1.py
Why caught here?
基本上,没有抓住异常。如果我打印出异常类型,则打印为<pytest1.MyError>
而不是<MyError>
。我想这是一些奇怪的周期性参考,但它似乎仍然应该有用。
答案 0 :(得分:9)
主python程序始终作为模块__main__
导入。
导入pytest2
时,它不会重复使用现有模块,因为最初导入的模块名称为__main__
而不是pytest2
。结果是pytest1
多次运行,生成多个异常类。 __main__.MyError
和pytest1.MyError
你最终扔了一个并试图抓住另一个。
因此,不要尝试从其他模块导入主模块。
答案 1 :(得分:2)
此问题是由导入作为模块运行的脚本引起的。这会产生两个独立的模块副本!
另一个例子:
<强> module.py 强>
import module
class Foo: pass
def test():
print Foo
print module.Foo
print Foo is module.Foo
if __name__ == '__main__': test()
<强> main_script.py 强>
import module
if __name__ == '__main__': module.test()
<强>结果强>
>python main_script.py
module.Foo
module.Foo
True
>python module.py
__main__.Foo
module.Foo
False
正在运行python somefile.py
会创建一个名为__main__
,而不是 somefile
的模块,并在该模块中运行somefile.py
中的代码。这就是if __name__ == '__main__':
用于检查此文件是作为脚本运行还是从其他文件导入的原因。
答案 2 :(得分:1)
...猜测,你有一个名称空间问题产生了一个不同的异常。
尝试替换
except:
print 'Why caught here?'
与
except Exception, e:
print e
这可能会告诉你更多关于出了什么问题。