私はパラメータの適切な数の任意の呼び出し可能f()
を呼び出すために、次のコードを使用します。f()
は、2つのパラメータの関数であるならば、ただ一つのパラメータでそれを呼び出すとTypeError
を発生させ、その機能を適切に呼び出すことができます現在のスコープで例外が発生したかどうかをチェックする方法は?
try:
res = f(arg1)
except TypeError:
res = f(arg1, arg2)
except
ブランチにあります。
f()
一パラメータ関数であり、例外は、例えば、(おそらくいくつかの機能に悪い呼の)f()
の体内にraisenされたときに問題がある:
def f(arg):
map(arg) # raises TypeError
制御フローが進みますf()
の内部エラーのためにexcept
ブランチに転送します。もちろん、f()
を2つの引数で呼び出すと、新しいTypeError
が生成されます。その後、元のエラーへのトレースバックの代わりに、私はf()
の呼び出しに2つのパラメータを使用してトレースバックを取得します。これは、デバッグ時にはあまり役に立ちません。
私のコードでは、現在の範囲で例外を発生させて例外を認識して、それを再認識することはできますか?
私はこのようなコードを書きたい:
try:
res = f(arg1)
except TypeError:
if exceptionRaisedNotInTheTryBlockScope(): # <-- subject of the question
raise
res = f(arg1, arg2)
私はexcept
ブロックでexc_info = sys.exc_info()
を追加することでwalkarroundを使用することができます知っています。
f()
は私のモジュールのユーザーから与えられているため、私は制御できません。また、その__name__
属性は'f'
以外でもかまいません。 f()
への不正な再発呼によって内部例外が発生する可能性があります。 ウォークアラウンドは、作者f()
によるデバッグを複雑にするので不適切です。
あなたはあなたの 'except'ブロックの終わりを単に' raise'するだけです。トレースバックは、エラーが発生した場所からコールスタックをアンラップし、発生したレベルと場所を正確に示します。トレースバックを見るには、exceptinをキャッチしないか、print_exc()のようなトレースバック関数を使用しないでください。 – Muposat
@Muposat reraisingは私が求めているものではありません。例外が現在のスコープ内で発生したのか、より深いところで発生したのかに応じて、条件付きで再評価する必要があります。 – abukaj
後で 'e:saved_e = e'のようなTypeErrorのためにそれを保存することができ、後であなたがチェックすることができます:' saved_e:raise saved_e' – Muposat