Python:捕获特定异常

Jos*_*osé 53 python

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

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

但它引发了一个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
Run Code Online (Sandbox Code Playgroud)

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

mgi*_*son 63

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

if str(e) != "..."
Run Code Online (Sandbox Code Playgroud)

代替.

例:

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

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

class MyValueError(ValueError): pass
Run Code Online (Sandbox Code Playgroud)

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

  • 在Python 3中,'Exception.message`属性已经消失了,您是否可以更新您的答案以反映并提出替代方案(例如,`str(e)`)?对于这类问题,这个问题是一个很好的规范重复 (2认同)

Bas*_*nen 5

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

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

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