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

时间:2011-08-03 21:00:34

标签: python

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

4 个答案:

答案 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)

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

如果您要抛出自定义异常,则可以在引发它们时提供其他信息:

raise Exception(12)  # 12 is the error code

然后通过args属性获取它:

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

更好的方法可能是继承Exception并提供您自己的属性(例如error_codemodule_name)。

答案 3 :(得分:0)

try:
    import moduleB
except ImportError:
    pass

这应该足够简洁。