如何区分ImportError中的“未找到模块”和“模块抛出异常”?

1 投票
2 回答
1183 浏览
提问于 2025-04-15 16:45

在Python中,如果你写了import does_not_exist,程序会报错,显示ImportError,这意味着你试图导入一个不存在的模块。

import exists

比如说,如果你有一个文件叫exists.py

import does_not_exist

同样也会报ImportError

那么,我该怎么在代码中区分这两种情况呢?

2 个回答

2

你可以使用 traceback 里的 tb_next。只有当异常发生在其他模块时,它才会有值,不会是 None。

import sys
try:
    import exists
except Exception, e:
    print "None on exists", sys.exc_info()[2].tb_next == None

try:
    import notexists
except Exception, e:
    print "None on notexists", sys.exc_info()[2].tb_next == None

>>> None on exists False
>>> None on notexists True
3

我知道的唯一方法就是检查一下最顶层的模块名是否在异常信息里“存在”。

try:
  import exists
except ImportError as exc:
  if "exists" in str(exc):
     pass
  else:
     raise

这会不会是对Python的ImportError的一个功能请求呢?如果有一个变量专门用来存模块名,那肯定会方便很多。

撰写回答