Python中的自定义异常处理
我有两个模块,一个叫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
类。你应该考虑重新设计一下你的应用,这样可以避免循环导入的问题。