1

例外インスタンスがあり、そのタイプに応じてコードを実行する必要があります。どちらの方法がより明確ですか - re raise exception または isinstance check?

再レイズ:

try:
    raise exception
except OperationError as err:
    result = do_something1(err)
except (InvalidValue, InvalidContext) as err:
    result = do_something2(err)
except AnotherException as err:
    result = do_something3(err)
except:
    pass

インスタンスチェック:

if isinstance(exception, OperationError):
    result = do_something1(err)
elif isinstance(exception, (InvalidValue, InvalidContext)):
    result = do_something2(err)
elif isinstance(exception, AnotherException):
    result = do_something3(err)

PS。コードは django process_exception ミドルウェアで使用されるため、例外を再発生させるときはexcept:pass、すべての未知の例外について記述する必要があります。

4

2 に答える 2

1

except: pass最初に句を取り除きます-特に裸の句では、黙って例外を渡してはいけませexceptん (とにかく裸のexcept句を使用するべきではありません)。

そうは言っても、「最良の」方法は実際には具体的なユースケースに依存します。上記の例では、異なる例外/例外セットに対して異なるハンドラーが明確にあるため、明らかな解決策は最初のものです。isinstanceすべてまたはほとんどのハンドラーに共通のコードと、1 つの例外または例外サブセットに固有のコードがある場合は、特定の部分に使用したい場合があります。つまり、次のようになります。

try:
   something_that_may_fail()
except (SomeException, SomeOtherException, YetAnotherOne) as e:
   do_something_anyway(e)
   if isinstance(e, YetAnotherOne):
      do_something_specific_to(e)

mkrieger がコメントしたように、処理する例外が 3 つ以上あるのは、コードまたはデザインの匂いかもしれません - try ブロックの部分があまりにも多くのことをしている可能性があります - しかし、時には選択肢があまりありません (ビルトインまたはさまざまな方法で失敗する可能性があるサードパーティ関数...)。

于 2015-09-04T09:37:33.510 に答える