Python:捕获特定异常

时间:2012-11-23 14:40:19

标签: python

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

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

但它引发了一个SyntaxError:无法分配给文字。
然后我试了一下:

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

但它提出了例外,即使它是我想避免的那个。

3 个答案:

答案 0 :(得分:53)

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")

通常情况下,如果你可以提供帮助,你真的不想依赖错误信息 - 这有点太脆弱了。如果您可以控制可调用macdat,而不是在ValueError中引发macdat,则可以引发一个继承自ValueError的自定义异常:

class MyValueError(ValueError): pass

然后你只能抓住MyValueError并让其他ValueError继续被其他东西(或不是)抓住。简单except ValueError仍会捕获此类异常,因此它在其他代码中的行为应该相同,这可能也会从此函数中捕获ValueErrors。

答案 1 :(得分:5)

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

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

要做到这一点,请使用不带参数的raise(当然,在except块中,否则没有"当前"异常)。

答案 2 :(得分:1)

您可以使用:-O3type(e)。它返回一个元组,将其与您自己的元组匹配。