比较Python中的异常对象

Ped*_*dro 10 python comparison exception

我是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
Run Code Online (Sandbox Code Playgroud)

我应该如何进行这种比较以获得"真实"?

我想做什么:

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)
Run Code Online (Sandbox Code Playgroud)

(可能是一些语法错误)

为什么我这样做?因为我不想两次打印相同的错误

nne*_*neo 15

对于大多数异常类,您可以使用测试功能相等性

type(e) is type(e2) and e.args == e2.args
Run Code Online (Sandbox Code Playgroud)

这测试它们的类完全相同,并且它们包含相同的异常参数.这可能不适用于不使用的异常类args,但据我所知,所有标准异常都可以.

  • @Lattyware:好的,我会用`type`.谢谢你的提示. (3认同)
  • 作为一个注释,我真的不喜欢在这里使用`e .__ class__` - 由于某种原因存在`type()`,如果你想要一个对象的类型,那就是访问它的方式. (2认同)
  • @ChrisKrycho这完全取决于OP想要的东西 - 我想不出你想要这样做的情况,所以我不知道OP是否需要等同于那个级别.在任何人说出哪个答案更可取之前,OP确实需要更多地解释他想要的东西. (2认同)
  • @Lattyware:想要测试两个`KeyError`s ​​是否指向同一个缺失的键呢?或者两个 `IOError` 是否实际上是相同的 `errno`?(是的,有一些特定于类的方法可以进行检查,但是使用`.args` 为您提供了一个很好的通用方法)。 (2认同)

Gar*_*tty 7

您想要检查 异常的类型:

>>> isinstance(e2, type(e))
True
Run Code Online (Sandbox Code Playgroud)

注意,自然,这将允许子类 - 这是一个奇怪的事情,所以我不确定你正在寻找什么行为.