4

コードを書いているときにわからないことがあれば、The Zen of Pythonもう一度読み直そうとしています。今回は、それらの行が私をためらわせます。

Errors should never pass silently.
Unless explicitly silenced.

現在のコードでは、次のような関数がいくつかあります。

def add_v_1(a, b):
    return a + b 

そして、それらのすべての呼び出しは次のようになります。

c = add_v_1(7, [])

このようなコードの例外は、上位層で発生してキャッチされます。

しかし、それはこのようであるべきですか?

add_v_1例外が発生する可能性がTypeErrorあり、それから回復したい。したがって、可能な関数の呼び出しは次のようになります。

try:
    c = add_v_1(7, [])
except TypeError:
    print "Incorrect types!"

しかし、呼び出しごとに例外処理を行う必要があります。これは重く見えます。

だから、私はできる:

def add_v_2(a, b):
    try:
        return a + b
    except TypeError:
        print "Incorrect types!"

呼び出しは次のようになります。

c = add_v_2(7, [])

よりきれいに見えます。

これらのアプローチはすべて従うように見えますThe Zen of Pythonが、どれがより良い選択ですか?

4

3 に答える 3

2

それから回復できる場合は、例外を処理する必要があります。互換性のないタイプの 2 つの値を追加しようとすると、それから回復するためにできることは何もありません (それ以上のコンテキストなしで)。

IntegerWrapper クラスを作成し、関数「add_v_2」が通常 2 つの値を連結しようとする必要があると仮定します。

def add_v_2(a, b):
    try:
        return a + b
    except TypeError as e:
        if isinstance(a, IntegerWrapper):
            return str(a) + b
        else:
            print("I dont know how to handle this type: " + type(a).__name__)
            # reraise the error so the caller can handle it
            raise

これはa「間違ったタイプ」から回復しようとしますが、それから回復する方法を知っていれば。わからない場合 (a が別の型である場合)、例外を再発生させて、これを処理する方法を知っている人にエラーが表示されるようにします。

(もちろん、その実装にはバグが含まれています。「良い実装」を意図したものではありません)

于 2016-02-29T09:32:03.627 に答える