如果异常总是致命的,那么在Python中使用它们很容易
# moduleB.py
import moduleC
但是评估异常需要的不仅仅是它的类型,我们经常需要确定异常的来源
# moduleA.py
try:
import moduleB
except ImportError as e:
print e
if str(e) == "No module named moduleB":
pass
else:
raise
在某些项目中,此模式会导致大量代码难以阅读。这是确保我捕获本地异常的最佳方法吗?我想能够写
import moduleB else pass
答案 0 :(得分:3)
抱歉,您发布的示例是规范的做法。 Python没有任何语法来捕获import
语句引发的异常,但不包含其下面的异常。
只是一个小警告:str(e)
如果e
的消息是unicode,则会导致unicode错误。您可以使用repr(e)
修复此问题。
答案 1 :(得分:2)
不,不要尝试分析错误字符串。如果需要,可以记录异常以进行调试,但如果可以“导入”,那么这就足够了:
try:
import foo
except ImportError:
pass # or foo = None or whatever
答案 2 :(得分:1)
在您的特定情况下,解析字符串是唯一可行的解决方案,但请注意您不需要这样做:如果moduleB
或moduleB
是由{导入的模块,有什么区别? {1}}找不到?
如果您要抛出自定义异常,则可以在引发它们时提供其他信息:
raise Exception(12) # 12 is the error code
然后通过args
属性获取它:
if e.args[0] == 12:
handle()
更好的方法可能是继承Exception
并提供您自己的属性(例如error_code
或module_name
)。
答案 3 :(得分:0)
try:
import moduleB
except ImportError:
pass
这应该足够简洁。