2013-04-05 23 views
9

Python'da yeniyim ve bu sorunla karşılaştım.Python'da İstisna Nesnelerini Karşılaştırma

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 

nasıl "Doğru" elde etmek için bu karşılaştırmayı yapmak gerekir: Ben örnek, iki "istisna nesneleri" karşılaştırmak çalışıyorum?

ben yapmaya çalışıyorum Ne:

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) 

(muhtemelen bazı sözdizimi hatası)

Bunu neden yapıyorum? Bunu yapmak için garip bir şeydir, bu yüzden' -

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

Not doğal olarak bu alt sınıfları için izin verecektir: Ben de aynı hatayı yazdırmak istemiyorum Çünkü iki kez

+1

Gerçekten burada ne yapmaya çalışıyorsunuz? Bir cevap verdim, ama bunun hakkında daha iyi bir yol olduğunu hayal ediyorum. –

+0

Soruyu güncelledim, cevabınız (jenerik) orijinal soruma mükemmeldi, ama ne yazık ki benim sorunum üzerinde çalışmaz (aynı türden iki istisna, fakat farklı özelliklerim varsa, eşitlik için bir “doğruya” ihtiyacım var) Karşılaştırma) – Pedro

+1

Tanımın benimki nasıl çalışır. –

cevap

7

Sen to checkthe type of the exception istiyorum Hangi davranışları aradığınızdan emin değilsiniz. En istisna sınıfları ile

+0

FWIW, autopep8, tür (e) türünü (e2) '' isinstance (e, type (e2)) 'olarak dönüştürür. Yine de yine de e.args == e2.args' ile başka bir assert eklemeye değer. –

13

, sen bu onların sınıfları tam olarak aynı olduğunu test eder ve aynı istisna argümanları içeren

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

fonksiyonel eşitlik için test edebilirsiniz. Bu, args kullanmayan istisna sınıfları için çalışmayabilir, ancak benim bilgime göre, tüm standart istisnalar yapar.

+1

Bu durumun Lattyware'in yanıtından biraz daha iyi olduğunu düşünüyorum, çünkü bu istisnaların, her ikisi de aynı sınıfın iki örneğinin aynı olup olmadığıyla eşdeğer argümanlara sahip olsaydı, size gerçekten söyler. Farklı argümanlarla yetiştirilmiş aynı sınıfın iki istisnası olabilir; Bu size daha fazla "denklik" verir. Benim tek yorumum aşağıda @ Lattyware ile aynıdır: 'type()' '__class__' daha iyidir. –

+2

Bir not olarak, gerçekten de 'e .__ class__' kullanımını kullanmayı sevmiyorum -' type() 'bir nedenden dolayı var, ve eğer bir nesnenin türünü istiyorsanız, ona erişim yolu. –

+2

@Lattyware: Tamam, 'type' kullanacağım. Bahşiş için teşekkürler. – nneonneo