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 に答える