2013-04-05 2 views
9

Sono nuovo su Python e sono bloccato a questo problema. Sto cercando di confrontare due "oggetti di eccezione", ad esempio:Confronto di oggetti di eccezione in 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 

Come devo eseguire questo confronto per ottenere un "vero"?

Quello che sto cercando di fare:

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) 

(probabilmente qualche errore di sintassi)

perché sto facendo questo? Perché io non voglio stampare lo stesso errore due volte

+1

Cosa stai cercando di fare qui? Ho dato una risposta, ma immagino ci sia un modo migliore per farlo. –

+0

Ho aggiornato la domanda, la tua risposta era perfetta per la mia domanda (generica) originale, ma sfortunatamente non funzionerà sul mio problema (se ho due eccezioni dello stesso tipo, ma attributi diversi, ho bisogno di un "vero" per l'uguaglianza confronto) – Pedro

+1

La tua descrizione è come funziona la mia. –

risposta

7

Volete to checkthe type of the exception:

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

nota, naturalmente, questo permetterà di sottoclassi - questa è una cosa strana da fare, così ho' Non sono sicuro del comportamento che stai cercando.

+0

FWIW, autopep8 converte 'type (e) is type (e2)' a 'isinstance (e, type (e2))'. Probabilmente valga la pena aggiungere un'altra affermazione con 'e.args == e2.args'. –

13

Con la maggior parte delle classi di eccezioni, è possibile verificare l'uguaglianza funzionale con

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

Questo prova che le loro classi sono esattamente identici, e che contengono gli stessi argomenti di eccezione. Questo potrebbe non funzionare per le classi di eccezioni che non utilizzano args, ma, a mia conoscenza, tutte le eccezioni standard lo fanno.

+1

Penso che questo sia leggermente migliore della risposta di Lattyware per il semplice motivo che questo in realtà ti dice se le eccezioni hanno argomenti equivalenti, il che non è lo stesso se sono entrambe istanze della stessa classe. Potresti avere due eccezioni della stessa classe che sono state sollevate con argomenti diversi; questo ti dà più "equivalenza" a riguardo. Il mio unico commento è lo stesso di @ Lattyware di seguito: 'type()' è migliore di '__class__'. –

+2

Come nota, non mi piace molto l'uso di 'e .__ class__' qui -' type() 'esiste per un motivo, e se vuoi il tipo di un oggetto, è il modo per accedervi. –

+2

@Lattyware: OK, userò 'type'. Grazie per il consiglio. – nneonneo