Python:捕获特定异常

标签 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: 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

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

最佳答案

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,您可以引发从 继承的自定义异常值错误:

class MyValueError(ValueError): pass

那么你只能捕获 MyValueError 并让其他 ValueError 继续被其他东西(或不被其他东西)捕获。简单的 except ValueError 仍然会捕获这种类型的异常,因此它在其他可能也从该函数捕获 ValueErrors 的代码中的行为应该相同。

关于Python:捕获特定异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13531247/

相关文章:

python - 如何重新配置​​ pandas 数据框?

python - 将其写入文件的正确语法是什么?

Java/Android - 如何打印出完整的堆栈跟踪?

c++ - 为什么不捕获 `std::promise::~promise` 中已经传播的异常

java - 处理无效文件异常的最佳方法是什么?

python - 计算 itertools.product() 的第 n 个结果

python - 如何删除数组中最小的数字,如果有多个最小数字,则删除第一个

java.lang.IllegalStateException : Cannot forward after response has been committed in servlet 错误

python - datetime.now() 在 Django 应用程序中返回错误的日期

python - 打印错误消息而不打印回溯,并在不满足条件时关闭程序