如果异常总是致命的,那么在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
很抱歉,但您发布的示例是规范的执行方法。Python没有任何语法来捕获import
语句引发的异常,但没有捕获它下面的异常。
不过,这只是一个小警告:如果e
的消息是unicode,那么str(e)
可能会导致unicode错误。您可以使用repr(e)
来修复此问题。
try:
import foo
except ImportError:
pass # or foo = None or whatever
在您的特定情况下,解析字符串是唯一可行的解决方案,但请注意,您不需要这样做:如果moduleB
或moduleB
导入的模块找不到,有什么区别?
如果你抛出自定义异常,你可以在提出它们时提供额外信息:
raise Exception(12) # 12 is the error code
然后通过args
属性获取
if e.args[0] == 12:
handle()
更好的方法可能是将Exception
子类化,并提供自己的属性(例如error_code
或module_name
(。
try:
import moduleB
except ImportError:
pass
这应该足够充分和简洁。