同时引发两个错误

时间:2012-10-10 18:49:35

标签: python

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

我该怎么做?

7 个答案:

答案 0 :(得分:31)

问题是如何提升多个错误没有发现多个错误。

严格地说,您不能提出多个例外,但您可以提出一个包含多个例外的对象。

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 len(errors):
        raise Exception(errors)

答案 1 :(得分:5)

您可能会引发一个继承自ValueErrorKeyError的错误。它会被一个捕获块捕获。

class MyError(ValueError, KeyError):
    ...

答案 2 :(得分:2)

try :
    pass
except (ValueError,KeyError):
    pass

详细了解Handling exceptions

答案 3 :(得分:0)

是的,您可以使用

处理多个错误
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”变量。

查看文档:{​​{3}}

答案 4 :(得分:0)

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

  • 以下解决方案使用Exception Chainingfinally来执行一个异常后执行代码
  • 我们无需事先知道发生了什么异常
  • 请注意,只能通过except从呼叫者中检测到只有第一个例外
    • 如果这是一个问题,请使用@Collin的solution above从所有收集的异常中继承
  • 您将看到以下例外:
    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

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

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提高倍数”的顶部搜索结果,因此我分享了我的方法,以填补解决方案范围中与IMHO相关的空白。

答案 5 :(得分:0)

您可以像这样提出多个异常:

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

答案 6 :(得分:-1)

如果您需要针对每种类型的错误执行不同的操作

try:
    pass
except ValueError:
    pass
except KeyError:
    pass