Сравнение объектов исключения в 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

С большинством классов исключений вы можете проверить функциональное равенство с помощью

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

Это проверяет, что их классы в точности идентичны и что они содержат одни и те же аргументы исключений. Это может не работать для классов исключений, которые не используют args, но, насколько мне известно, все стандартные исключения делают.

Ответ 2

Вы хотите проверить тип исключения:

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

Обратите внимание, что это, естественно, позволит подклассы - это странная вещь, поэтому я не уверен, какое поведение вы ищете.

Ответ 3

В этом случае было бы полезно сравнить сообщение об исключении с помощью str().

...
        except urllib2.HTTPError as e:
            if e.code == 400: 
                if isinstance(oldError, type(e)) and str(e) != str(oldError): 
                    print 'Error one'
            else: 
                if isinstance(oldError, type(e)) and str(e) != str(oldError): 
                    print "Error two"
            raise
         except urllib2.URLError as e:
             if isinstance(oldError, type(e)) and str(e) != str(oldError): 
                 print 'Error three'
             raise
...