Python中的自定义异常处理

3 投票
2 回答
4199 浏览
提问于 2025-04-15 15:41

我有两个模块,一个叫main,另一个叫notmain。我在main模块里定义了一个自定义异常,想要捕捉到这个异常。这个异常是在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

这意味着异常在某种情况下被捕捉到了,但为什么我会看到追踪信息呢?还有,为什么异常类的名字是"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 个回答

1

带有下划线的__main__这个名字,是程序被调用时自动生成的一个命名空间。你可以考虑在第三个文件中声明异常(或者让第三个文件成为用户调用的程序,而在你“真正的”程序中只放一个方法)。

另外,你导入notmain的方式可能也和这个有关。为什么不直接用“from notmain import func”呢?

8

你的模块 main 被导入了两次,分别叫 main__main__,每次导入都有自己的 MyException 类。你应该考虑重新设计一下你的应用,这样可以避免循环导入的问题。

撰写回答