Python:捕捉特定的exception

我想要捕获一个特定的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 

但是,即使它是我想避免的,也会引发例外。

except ValueError,ee是exception的一个实例,而不是一个string。 所以当你testinge是不是等于一个特定的string时,那个testing总是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中引发ValueErrormacdat可以引发从ValueErrorinheritance的自定义exception:

 class MyValueError(ValueError): pass 

那么你只能捕获MyValueError并让其他的ValueError继续被别的东西(或不是)所捕获。 except ValueError ,其它的类似的exception仍然会捕获这种types的exception,所以它在其他代码中的performance应该是相同的,这些代码也可能会从这个函数中捕获ValueErrors。

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

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

要做到这一点,请使用不带参数的raise(当然在except块内,否则不存在“当前”exception)。