2013-04-05 19 views
9

私はPythonで新しく、この問題に悩まされています。Pythonでの例外オブジェクトの比較

try: 
    0/0 
except Exception as e: 
    print e 
>> integer division or modulo by zero 

try: 
    0/0 
except Exception as e2: 
    print e2 
>> integer division or modulo by zero 

e == e2 
>> False 

e is e2 
>> False 

"True"を取得するにはどうすればよいですか?

私が行うには何をしようとしています:

class foo(): 
    def bar(self, oldError = None): 
     try: 
      return urllib2.urlopen(someString).read()     
     except urllib2.HTTPError as e: 
      if e.code == 400: 
       if e != oldError: print 'Error one' 
      else: 
       if e != oldError: print "Error two" 
      raise 
     except urllib2.URLError as e: 
      if e != oldError: print 'Error three' 
      raise 

class someclass():   
    # at some point this is called as a thread 
    def ThreadLoop(self, stopThreadEvent): 
     oldError = None 
     while not stopThreadEvent.isSet(): 
      try: 
       a = foo().bar(oldError = oldError) 
      except Exception as e: 
       oldError = e 
      stopThreadEvent.wait(3.0) 

(おそらくいくつかの構文エラー)

なぜ私はそれをやっていますか? 私は二回

+1

ここで実際に何をしようとしていますか?私は答えを出しましたが、これについてもっと良い方法があると思います。 –

+0

あなたの答えは私の(一般的な)オリジナルの質問には完璧でしたが、残念なことにそれは私の問題では機能しません(同じ型の2つの例外はありますが属性が異なる場合、比較) – Pedro

+1

あなたの説明はどのように私の作品です。 –

答えて

7

あなたはto checkthe type of the exceptionたい同じエラーを印刷しないので:

>>> isinstance(e2, type(e)) 
True 

注意を、当然、これはサブクラスを可能にする - これが行うには奇妙なことであるので、私は」あなたが探している行動がわからない。ほとんどの例外クラスで

+0

FWIWの場合、autopep8は 'type(e)がtype(e2)'を 'isinstance(e、type(e2))'に変換します。しかし、おそらく 'e.args == e2.args'という別のアサーションを追加する価値があります。 –

13

、あなたはこれが彼らのクラスが全く同じであることをテストし、それらが同じ例外の引数が含まれていることを

type(e) is type(e2) and e.args == e2.args 

で機能的等価性をテストすることができます。これは、argsを使用しない例外クラスでは機能しないかもしれませんが、私の知る限り、すべての標準例外が行います。

+1

これは、例外が同等の引数を持っているかどうかを実際に教えてくれるという単純な理由から、Lattywareの回答よりも若干優れていると思います。これは同じクラスの両方のインスタンスであるかどうかと同じではありません。あなたは、異なる引数で提起された同じクラスの2つの例外を持つかもしれません。この点で、より多くの「同等性」を提供します。私の唯一のコメントは以下の@ Lattywareと同じです: 'type()'は '__class__'よりも優れています。 –

+2

ここでは、 'e .__ class__'の使用を本当に嫌っています - 理由のために' type() 'が存在し、オブジェクトの型が必要な場合はそれにアクセスする方法です。 –

+2

@Lattyware:OK、私は 'type'を使用します。先端に感謝します。 – nneonneo

関連する問題