1

検討

try:
    f(*args, **kwargs)
except TypeError:
    print "doh!"

この場合の理由はTypeError、関数の引数に問題がある可能性がありますf() got an unexpected keyword argument 'b'。ただし、TypeError関数本体自体の問題が原因で発生することもありますlist indices must be integers, not str

Python 2 では、両方のケース (引数の問題、本体の問題) を区別するためのしっかりした方法があるのだろうかと思います。たぶん、デコレータベースのアプローチですか?

理由: 私は別の種類のジョブ システムを実装しています。ジョブは基本的に機能です。この関数への引数は、ユーザー入力から派生し、JSON シリアライゼーション/デシリアライゼーション プロセスを経ることができます。システムのユーザーに可能な限り正確なエラー メッセージを提供するシステムが必要です。したがって、ジョブの実行を制御するエンティティが の両方のソースを区別できるようにしたいと考えていますTypeError。さらに、これ自体が非常に興味深い問題だと思います。

https://stackoverflow.com/questions/12712475/how-to-check-if-a-typeerror-raised-from-mismatched-function-arguments基本的にこの質問の複製であることを認識しています。しかし、そこでのコメント ディスカッションは、何の回答も得られずに止まってしまいました。この場合、私自身の質問を開いて問題を再定式化しても問題ないことを願っています。

4

2 に答える 2

1

したがって、伝播したい内部エラーはコーディングエラーであり、キャッチする必要がある実際の例外ではないため、私はそのようにはしません。

そうは言っても。スローされたエラーを内省し、一方を沈黙させ、もう一方を伝播します。

于 2012-10-12T21:09:12.473 に答える
0

次の方法でこの問題を解決できると確信しています。

ステップ 1.をサブクラス化して、ボディ内 TypeErrorのカスタム例外 (例: ) を作成しますAwfulTypeErrorException

class AwfulTypeError(Exception):
    pass  # Or do something if necessary

ステップ 2.関数本体全体tryブロックでラップしexcept TypeError、そのブロックに対して:

def my_function(a, b, c):
    try:
        # Some operations you need to do
        return (a + b) * c
    except TypeError as e:
        # We're doing stuff here in the next step

ステップ 3.元の例外をキャッチしたら、以前に指定TypeErrorした例外として再発生させます。AwfulTypeError

    except TypeError as e:
        raise AwfulTypeError(e)

これで、 のままである引数 TypeErrorと、現在は type になっている本体内の TypeErrorを区別できるようになりました。TypeErrorAwfulTypeError

PS私はPython 3に慣れているので、 Python 2の構文で何か問題が発生した場合は、遠慮なくお知らせください。

于 2017-08-09T11:00:44.817 に答える