2009-11-05 113 views
3

我有两个模块,main和notmain。我在主模块中声明了我的自定义异常,并想要捕获它。这个异常在非主模块中引发。问题是我无法捕捉到我在主模块中引发的异常。Python中的自定义异常处理

main.py:

class MyException(Exception): 
    pass 

m = __import__('notmain') 
try: 
    m.func() 
except MyException as e: 
    print(type(e)) 
    print('ops') 

notmain.py:

def func(): 
    import main # 1 
    # from main import MyException # 2 
    # from main import MyException as MyException # 3 

    raise main.MyException # 1 
    # raise MyException # 2, 3 

我尝试了不同的导入方法,具有相同的结果。当我运行main.py,我看到:

<class 'main.MyException'> 
ops 
Traceback (most recent call last): 
    File "D:\exception\main.py", line 6, in <module> 
    m.func() 
    File "D:\exception\notmain.py", line 6, in func 
    raise main.MyException # 1 
main.MyException 

这意味着异常莫名其妙地抓住了,但为什么我看到回溯?为什么异常类有“main.MyException”的名字?

现在,如果我修改main.py一点点并运行它:

try: 
    raise MyException 
except MyException as e: 
    print(type(e)) 
    print('ops') 

我会看看有什么期望:

<class '__main__.MyException'> 
ops 

我不知道为什么这个类MyException有不同的main.py和notmain.py中的名称?为什么Python无法按预期抓住它?

谢谢:)

回答

8

你的模块main是进口的两倍(如main__main__),每个都具有自己的类MyException。您应该考虑重新设计您的应用程序以避免循环导入。

1

__main__带下划线的名称是被调用程序的自动命名空间。一种解决方法是在第三个文件中声明异常(或者让第三个文件是用户调用的程序,而在你的“真实”程序中只有一个方法)。

此外,您导入notmain的方式可能与它有关。为什么不只是“从非主要导入功能”?

+0

谢谢。我动态地导入模块(我只在运行时知道模块的名字),所以__import__是唯一的方法。 – demalexx 2009-11-05 15:15:02