Python:捕获特定异常

2024-05-23 18:21:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我想捕捉一个特定的ValueError,而不仅仅是任何ValueError。
我试过这样的方法:

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

但它引发了一个语法错误:无法赋值给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

但这引发了一个例外,即使这是我想避免的。


Tags: idforstringisnotmachinethiswind
2条回答

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

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

为此,请使用raise而不带参数(当然,在except块中,否则就没有“current”异常)。

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,而不是在macdat中引发一个ValueError,您可以引发一个继承自ValueError的自定义异常:

class MyValueError(ValueError): pass

然后,您只能捕获MyValueError,并让其他ValueError继续前进,以被其他东西捕获(或不被捕获)。简单的except ValueError仍然会捕获这种类型的异常,因此它在其他代码中的行为应该相同,这些代码也可能会捕获此函数中的值错误。

相关问题 更多 >