2011-01-23 8 views
2

と呼ばれた場所で同じ例外の区別、私はこの(簡体字)のように見える避けられない状況があります。 :それは

しかし、yで発生するTypeErrorと、それに何も含まれていないか、あまりにも多すぎる(したがって、十分な引数がないか、あまりにも多い)/ kwargs悪いかfoo == barので。

実際の設定では、2つ以上呼び出すことができ、より多くの機能がありますが、それらにオープンコードを持っていないすべてが。

本当にありがとうございました!

答えて

2

マットBillensteinさんのコメントをMorrowの答えはこれを行う正しい方法です。しかし、代わりに、いくつかの奇妙な理由でそれをすることさえできない場合は、inspectモジュールを見ることもできます。

try: ugly() 
except TypeError as e: 
    stack = inspect.stack() 
    [...look at the stack...] 

Info about the inspect module.

は "ラッピング" の問題について詳しく説明するには:あなたは関数がFUNCTION_TO_CALLに割り当てされるために利用可能であるかを制御することが仮定し、これがfooを意味y_better

def y_better(foo, bar=None): 
    try: y(foo, bar) 
    except TypeError: 
     if foo == bar: # detect foobar condition 
      raise FoobarError() 
     else:   # not foobar, so re-raise the exception 
      raise 

作成==バーは2回テストされていますが、制限があるため、より良い方法はありません。

3

あなたはいつもあなた自身の例外を作ることができますTypeErrorを継承し、個別に使用します。

class TooManyArgumentsError(TypeError): 
    pass 
class EqualityError(TypeError): 
    pass 
+1

いいえ、私は 'TypeError'を発生させる関数は修正できないコードで書かれています。 –

+0

しかし、ありがとうとスタックオーバーフローへようこそ! –

+7

変更できない関数をラップし、TypeErrorをキャッチして別の例外を発生させます... –

1

は、カスタム例外を定義します。

クラスyTypeError(TypeError例外): パス

は、(Yでこれを上げる)とYのみで()キース上