それは何をするかfoo
に依存し、Exception
の種類、私が言うと思います。
発信者がそれを処理する必要がありますか?例えば
、次の例を考えてみます。
def try_get_value(registry, key):
try:
return registry[key]
except KeyError:
return None
この関数は、そのキーを使用して辞書から値を取得しようとします。値が存在しない場合は、None
を返します。
この場合、KeyError
を処理する必要があります。これは、予想される動作に準拠するために、None
を返す必要があるためです。 (それは、このエラーキャッチする方法のresponsabilityです)
をしかし、他の例外タイプを考える、などTypeError
(例えば、レジストリはdict
ない場合)。
なぜ私たちの方法でそれを処理すべきですか?それは呼び出し元の混乱です。彼はそれを処理する必要があり、彼はそれについて心配する必要があります。
さらに、もし私たちがこのようなことをすれば私たちの方法はできますか?Exception
?この範囲からそれを処理する方法はありません。
try_get_value
には1つの簡単なタスクがあります:レジストリから値を取得する(存在しない場合はデフォルトの値)。呼び出し元がルールを破棄する責任はありません。
したがってはではないため、TypeError
をキャッチしません。
したがって、呼び出し側のコードは次のようなもののように見えることがあります。
try:
value = try_get_value(reg, 'some_key')
# Handle value
except TypeError:
# reg is not a dict, do something about it...
P.S.:私たちのfoo
メソッドが予期せぬ終了(など)でクリーンアップを行う必要がある場合があります。たとえば、閉じていないとリークするリソースが割り当てられています。)
この場合、foo
は例外をキャッチする必要があります。したがって、その状態を適切に修正できるはずですが、raise
を再度呼び出し元に戻す必要があります。
私はそれが 'foo()'と '#何らかのプロセス 'に依存していると言いたいでしょう。それはあなた自身の個人的なコーディングスタイルに単純に帰着しますが、非常にうまくいくかもしれません。 –
@ Ev.Kounisこれらの部分の違いは本当に(さまざまなケースで)違いますか? –