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