Python: 捕获特定的异常

我想抓住一个特定的 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

但它引发了例外情况,即使这是我想避免的情况。

62073 次浏览

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继续他们的方式被其他的东西抓住(或者不抓住)。Simple except ValueError仍然会捕获这种类型的异常,因此它在其他代码中的行为也应该相同,这些代码可能也会从这个函数捕获 ValueErerror。

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

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

要做到这一点,使用不带参数的引发(当然,在  一個句子中,否则就不存在「當前」例外)。

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