Python:捕获特定异常

Python:捕获特定异常,python,exception,Python,Exception,我想捕捉一个特定的ValueError,而不仅仅是任何ValueError 我试过这样的方法: try: maquina['WPF'] = macdat(ibus, id, 'WPF') except: ValueError, 'For STRING = ’WPF’, this machine is not a wind machine.': pass 但它会引发一个语法错误:无法分配给文字。 然后我试着: try: maquina['WPF'] = macdat(ibus, id,

我想捕捉一个特定的
ValueError
,而不仅仅是任何
ValueError

我试过这样的方法:

try: maquina['WPF'] = macdat(ibus, id, 'WPF')
except: ValueError, 'For STRING = ’WPF’, this machine is not a wind machine.':
    pass
但它会引发一个语法错误:无法分配给文字。
然后我试着:

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

但是它会引发异常,即使它是我想要避免的异常。

中,除了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
exception ValueError
仍将捕获此类型的异常,因此它在其他代码中的行为应与此函数捕获ValueErrors的行为相同。

最后一个方法是正确的(但打印报告(e)以查看其不起作用的原因)

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


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

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

您得到了下面的答案,但当您重新引发异常时,只需单独使用
raise
:这样,如果未处理异常,您仍然会得到原始堆栈回溯,而不是从引发异常的位置开始的堆栈回溯。这就是我想要的。感谢您的帮助和建议。Python3中的
异常.message
属性已消失,您能否更新您的答案以反映这一点,并建议一种替代方法(例如,
str(e)
)?对于这类问题,这个问题是一个很好的规范复制。有一些规范的方法可以处理特定的内置异常,比如错误数量的位置参数TypeError,而不依赖消息?@TodorMarkov——不太可能。我认为这个问题的论点是,它显然是一个编程错误,在大多数情况下可能不应该被处理。