76

我想捕捉一个特定的ValueError,而不是任何一个ValueError
我试过这样的事情:

try: maquina['WPF'] = macdat(ibus, id, 'WPF')
except: ValueError, 'For STRING = ’WPF’, this machine is not a wind machine.':
    pass

但它引发了一个SyntaxError: can't assign to literal.
然后我尝试了:

try: maquina['WPF'] = macdat(ibus, id, 'WPF')
except ValueError, e:
    if e != 'For STRING = ’WPF’, this machine is not a wind machine.':
        raise ValueError, e

但它引发了异常,即使它是我想要避免的异常。

4

3 回答 3

90

in except ValueError,e,e是异常的一个实例,而不是字符串。因此,当您测试是否e不等于特定字符串时,该测试始终为 False。尝试:

if str(e) != "..."

反而。

例子:

def catch(msg):
    try:
        raise ValueError(msg)
    except ValueError as e:  # as e syntax added in ~python2.5
        if str(e) != "foo":
            raise
        else:
            print("caught!")

catch("foo")
catch("bar")

通常,如果可以提供帮助,您并不想依赖错误消息——它有点太脆弱了。如果您可以控制 callable macdat,而不是引发ValueErrorin macdat,您可以引发自定义异常,该异常继承自ValueError

class MyValueError(ValueError): pass

然后,您只能抓住MyValueError并让其他ValueError人继续前进,以被其他人(或不被其他人)抓住。Simpleexcept ValueError仍然会捕获这种类型的异常,因此它应该在其他代码中表现相同,这些代码也可能从这个函数中捕获 ValueErrors。

于 2012-11-23T14:43:51.990 回答
5

最后一个的方法是正确的(但是打印 repr(e) 看看为什么它不起作用)。

但是,如果您希望异常信息正确,则不应引发新异常(就像您现在所做的那样),而应引发相同的异常。否则,更多捕获它的代码,或者如果没有捕获到错误消息,会将您的代码显示为源代码,而它应该是原始源代码。

为此,请使用不带参数的 raise(当然,在 except 块内,否则没有“当前”异常)。

于 2012-11-23T14:47:50.883 回答
3

您可以使用:type(e)e.args为此。它返回一个元组,将元组与您自己的匹配。

于 2020-12-17T16:04:19.850 回答