22

有没有办法通过使用 try 和 except 同时引发两个错误?例如, ValueErrorKeyError

我怎么做?

4

6 回答 6

110

该问题询问如何引发多个错误而不是捕获多个错误。

严格来说,您不能引发多个异常,但可以引发包含多个异常的对象。

raise Exception(
    [
        Exception("bad"),
        Exception("really bad"),
        Exception("really really bad"),
    ]
)

问题:你为什么要这样做?
:在循环中,当您想引发错误但处理循环以完成时。

例如,当与您一起进行单元测试时,unittest2您可能希望引发异常并继续处理,然后在最后引发所有错误。这样你就可以一次看到所有的错误。

def test_me(self):

    errors = []

    for modulation in self.modulations:
        logging.info('Testing modulation = {modulation}'.format(**locals()))

        self.digitalModulation().set('value', modulation)
        reply = self.getReply()

        try: 
            self._test_nodeValue(reply, self.digitalModulation())
        except Exception as e:
            errors.append(e)

    if errors:
        raise Exception(errors)
于 2018-05-18T15:27:21.227 回答
6

您可能会引发一个继承自ValueError和的错误KeyError。它会被任何一个 catch 块捕获。

class MyError(ValueError, KeyError):
    ...
于 2012-10-10T18:56:16.513 回答
2

是的,您可以处理多个错误,或者使用

try:
    # your code here
except (ValueError, KeyError) as e:
    # catch it, the exception is accessable via the variable e

或者,直接添加两种处理不同错误的“方式”:

try:
    # your code here
except ValueError as e:
    # catch it, the exception is accessable via the variable e
except KeyError as e:
    # catch it, the exception is accessable via the variable e

您也可以省略“e”变量。

查看文档:http ://docs.python.org/tutorial/errors.html#handling-exceptions

于 2012-10-10T18:55:15.327 回答
0

@shrewmouse 的解决方案仍然需要选择一个异常类来包装捕获的异常。

  • 以下解决方案使用Exception Chaining viafinally在一个异常发生后执行代码
  • 我们不需要事先知道,发生了什么异常
  • 请注意,只有发生的第一个异常可以通过调用者检测到except
    • 如果这是一个问题,请使用上面的@Collin解决方案从所有收集的异常中继承
  • 您将看到由以下分隔的异常:
    During handling of the above exception, another exception occurred:
def raise_multiple(errors):
    if not errors:  # list emptied, recursion ends
        return
    try:
        raise errors.pop()  # pop removes list entries
    finally:
        raise_multiple(errors)  # recursion

如果您有需要为 list 的每个元素完成的任务,则无需事先收集 Exceptions。这是一个带有多个错误报告的多个文件删除的示例:

def delete_multiple(files):
    if not files:
        return
    try:
        os.remove(files.pop())
    finally:
        delete_multiple(files)

PS:
使用 Python 3.8.5 测试
要打印每个异常的完整回溯,请查看traceback.print_exc
多年来一直回答原始问题。但由于此页面是“python raise multiple”的热门搜索结果,我分享了我填补解决方案范围中(恕我直言相关)空白的方法。

于 2020-09-16T17:00:16.470 回答
-1

您可以像这样引发多个异常:

try:
    i = 0
    j = 1 / i
except ZeroDivisionError:
    try:
        i = 'j'
        j = 4 + i
    except TypeError:
        raise ValueError

注意:可能只引发了 ValueError ,但此错误消息似乎是正确的:

Traceback (most recent call last):
  File "<pyshell#9>", line 3, in <module>
    j = 1 / i
ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<pyshell#9>", line 7, in <module>
    j = 4 + i
TypeError: unsupported operand type(s) for +: 'int' and 'str'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<pyshell#9>", line 9, in <module>
    raise ValueError
ValueError
于 2021-02-15T17:04:24.340 回答
-2
try :
    pass
except (ValueError,KeyError):
    pass

阅读有关处理异常的更多信息

于 2012-10-10T18:51:19.217 回答