Python中的自定义异常处理

时间:2009-11-05 14:49:49

标签: python exception exception-handling

我有两个模块,main和notmain。我在主模块中声明了我的自定义异常,并希望捕获它。在非主模块中引发此异常。问题是我无法捕获在非主模块中引发的异常。

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无法按预期捕获它?

谢谢:)

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:1)

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

此外,导入notmain的方式可能与它有关。为什么不只是“从notmain import func”?