3

我有这样的代码:

try:
    ....

    l.simple_bind_s(user, password)

except ldap.CONNECT_ERROR, e:
    sys.exit(1)

except ldap.BUSY, e:
    sys.exit(2)

except ldap.OPT_NETWORK_TIMEOUT, e:
    sys.exit(3)

except ldap.TIMEOUT, e: 
    sys.exit(4)

except ldap.SERVER_DOWN, e:
    sys.exit(5)

我正在尝试捕获各种异常。但是,所有异常都属于 SERVER_DOWN。例如,当出现超时异常时,它会陷入 SERVER_DOWN 异常等。我想知道是否存在类似于异常层次结构的东西,这就是它总是陷入 SERVER_DOWN 状态的原因。或者这段代码还有其他问题吗?你对这个问题有什么看法吗?提前致谢。

4

2 回答 2

2

是的,有一个异常层次结构,您应该始终开始捕获更具体的异常,最后捕获更广泛的异常。层次结构通常由继承确定。

在您的情况下,由于您最后捕获该异常,因此应该是因为您首先捕获的超时异常是指另一个包或命名空间。您捕获的最后一个异常是其他异常的超类。

于 2011-07-12T14:14:00.017 回答
1

如果issubclass(type(raised), named_in_except_clause),将触发 except 子句。因此,如果引发了“is a”的ldap.SERVER_DOWN异常并且它不是前面的 except 子句中的异常,则最后一个 except 子句将触发。LDAP 文档似乎没有说明 LDAP 特定异常的层次结构,但您总是可以在 REPL 中探索它。

于 2011-07-12T14:16:42.560 回答