3

現在NameError、次のコードで発生する問題があります。

try:
    # some network programming raising an exception
except ConnectionError:
    # some error handling

ドキュメントに記載されていないモジュールからインポートする必要があるため、これは機能しませんConnectionError(私は盲目なのかもしれません)。私が見つけたのはthisだけですが、別のリクエスト ライブラリを参照しています。

4

1 に答える 1

4

「一般的に使用できる」と予想される標準ライブラリのすべての例外は組み込みであり、ライブラリ リファレンスの組み込み例外の部分に記載されています。

3.3 では、次のものが含まれます。

例外 ConnectionError

接続関連の問題の基本クラス。

サブクラスはBrokenPipeErrorConnectionAbortedErrorConnectionRefusedErrorおよびConnectionResetErrorです。

しかし、これはビルトインです。したがって、これは機能するはずです:

except ConnectionError:

3.0-3.2 では、のような例外はありConnectionErrorません。stdlib には、その名前のものは何も発生しません。したがって、それを処理しようとしても意味がありません。( と が 3.2 と 3.3 の間で再編成された方法の説明については、PEP 3151 を参照してください。 )OSErrorIOError

3.2 に相当するConnectionErrorisOSErrorには特定のerrno値があります。したがって、あなたが望むのは次のようなものです:

except OSError as e:
    if e.errno not in (EPIPE, ESHUTDOWN, ECONNABORTED, ECONNREFUSED, ECONNRESET):
        raise
    # whatever you wanted to do for ConnectionError.

一方、将来、どのような種類の例外を処理する必要があるかわからない場合、テストするのは非常に簡単です。まず、例外の種類の修飾名をログに記録することで、例外を処理するテスト コードを記述します。次に、ログから型を取り出し、それを実際のコードで使用します。

try:
    code_that_raises()
except Exception as e:
    print(type(e), type(e).__qualname__, whatever_else_looks_useful(e))
于 2013-10-05T01:19:17.250 に答える