我有这样的代码:
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状态。或者此代码还有其他问题吗?你对这个问题有什么看法吗? 提前谢谢。
答案 0 :(得分:2)
是的,存在异常层次结构,您应始终开始捕获更具体的异常,并最终捕获更广泛的异常。层次结构通常由继承确定。
在您的情况下,因为您最后捕获该异常,应该是因为您首先捕获的超时异常是引用另一个包或命名空间。你捕获的最后一个异常是其他异常的超类。
答案 1 :(得分:1)
如果issubclass(type(raised), named_in_except_clause)
,则会触发except子句。因此,如果引发了“是”ldap.SERVER_DOWN
的异常并且它不是前面的except子句中的异常,则会触发最后一个except子句。 LDAP documentation似乎没有说明特定于LDAP的异常的层次结构,但您可以随时在REPL中进行探索。