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,e
, e
是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
中引发ValueError
, macdat
可以引发从ValueError
inheritance的自定义exception:
class MyValueError(ValueError): pass
那么你只能捕获MyValueError
并让其他的ValueError
继续被别的东西(或不是)所捕获。 except ValueError
,其它的类似的exception仍然会捕获这种types的exception,所以它在其他代码中的performance应该是相同的,这些代码也可能会从这个函数中捕获ValueErrors。
最后一个的方法是正确的(但是打印repr(e)看它为什么不起作用)。
但是,如果您希望exception信息是正确的,则不应引发新的exception(如现在那样),而是提出相同的exception。 否则,更多的代码捕获它,或者错误消息,如果它没有被捕获,将显示你的代码作为源,而它应该是原始的源。
要做到这一点,请使用不带参数的raise(当然在except块内,否则不存在“当前”exception)。