识别异常的正确方法是什么



如果异常总是致命的,那么在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

在您的特定情况下,解析字符串是唯一可行的解决方案,但请注意,您不需要这样做:如果moduleBmoduleB导入的模块找不到,有什么区别?

如果你抛出自定义异常,你可以在提出它们时提供额外信息:

raise Exception(12)  # 12 is the error code

然后通过args属性获取

if e.args[0] == 12:
    handle()

更好的方法可能是将Exception子类化,并提供自己的属性(例如error_codemodule_name(。

try:
    import moduleB
except ImportError:
    pass

这应该足够充分和简洁。

相关内容

最新更新