尝试:除了:不工作

时间:2011-02-10 00:28:16

标签: python exception exception-handling

所以我遇到了一个问题:try:except:机制似乎在python中没有正常工作。

以下是我的两个文件的内容。

pytest1.py

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?'

pytest2.py

from pytest1 import func1

def func2():
    func1()

执行第一个文件会产生以下输出:

$ python pytest1.py
Why caught here?

基本上,没有抓住异常。如果我打印出异常类型,则打印为<pytest1.MyError>而不是<MyError>。我想这是一些奇怪的周期性参考,但它似乎仍然应该有用。

3 个答案:

答案 0 :(得分:9)

主python程序始终作为模块__main__导入。

导入pytest2时,它不会重复使用现有模块,因为最初导入的模块名称为__main__而不是pytest2。结果是pytest1多次运行,生成多个异常类。 __main__.MyErrorpytest1.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

这可能会告诉你更多关于出了什么问题。