在Python中收集和报告多个异常的惯用方法

wks*_*rtz 29 python logging exception

人们过去常常在Python中捕获,记录和报告多个数据验证错误?

我正在Python 3中构建一个应用程序,它首先验证输入数据然后处理它.第一步报告错误是程序预期功能的一部分,因此我不希望我的验证器放弃第一个异常.特别是,数据是表格式的,我希望能够返回 - 而不是引发 - 表格的每一行都没有验证.

几年前的一次论坛讨论考虑了多种解决方案,包括以下内容,这对我来说似乎是最干净的:

errors = []
for item in data:
    try:
        process(item)
    except ValidationError as e:
        errors.append(e)
if errors:
    raise MultipleValidationErrors(errors)
Run Code Online (Sandbox Code Playgroud)

其中MultipleValidationErrors类需要有一个适当的__str__方法来列出所有有用的信息ValidationErrors在里面.

其他人建议使用该traceback模块,但由于我想要捕获的异常是数据验证错误而不是程序错误,这似乎是不合适的.但是,获取所logging涉及的模块可能是合适的.

Fre*_*Foo 7

我在C++和Python中都使用过这个习惯用法.这是我所知道的最干净的解决方案,当你想要的是一个例外,而不是一个日志消息.它的缺点是组合异常通常会占用线性空间,这在处理具有许多错误的大型数据集时可能会出现问题.

  • 当单独读取时,这个答案似乎缺少其上下文.我不知道你指的是什么成语. (5认同)
  • @ThorSummoner我认为larsmans指的是OP如何收集列表中的不同异常,然后引发包含列表的单个异常. (2认同)