Python中的自定义异常处理

Python中的自定义异常处理,python,exception,exception-handling,Python,Exception,Exception Handling,我有两个模块,main和notmain。我在主模块中声明了自定义异常,并希望捕获它。此异常在notmain模块中引发。问题是我无法捕获在notmain模块中引发的异常 main.py: class MyException(Exception): pass m = __import__('notmain') try: m.func() except MyException as e: print(type(e)) print('ops') notmain.py:

我有两个模块,main和notmain。我在主模块中声明了自定义异常,并希望捕获它。此异常在notmain模块中引发。问题是我无法捕获在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
我来看看预期的结果:

<class '__main__.MyException'>
ops

老年退休金
我不知道为什么这个类MyException在main.py和notmain.py中有不同的名称?为什么Python不能像预期的那样捕获它


谢谢:)

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

< P> <代码>代码> MyNo.<代码> <代码>名称,带有下划线,是被调用程序的自动命名空间。解决方法是在第三个文件中声明异常(或者有第三个文件,即用户调用的程序,并且在“真实”程序中只有一个方法)


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

谢谢。我动态导入模块(我只在运行时知道模块的名称),所以导入是唯一的方法。
<class '__main__.MyException'>
ops