python-ldap的异常有层次结构吗?
我有一段这样的代码:
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状态。或者这个代码还有其他问题吗?你们对此有什么看法吗?感谢大家的帮助。
2 个回答
1
如果 issubclass(type(raised), named_in_except_clause)
这个条件成立,那么异常处理的部分就会被触发。也就是说,如果抛出了一个“是” ldap.SERVER_DOWN
的异常,但它不属于之前 except 语句中列出的任何异常,那么最后的 except 语句就会被触发。关于 LDAP 特定异常的层级关系,LDAP 文档 似乎没有详细说明,不过你可以在 REPL 中自己探索一下。
2
是的,异常是有层级关系的。你应该先处理那些更具体的异常,最后再处理更宽泛的异常。这个层级关系通常是通过继承来决定的。
在你的情况中,因为你最后处理的异常,所以它应该是因为你首先处理的超时异常是指向另一个包或者命名空间。而你最后处理的异常是其他异常的父类。