有没有办法通过使用 try 和 except 同时引发两个错误?例如, ValueError
和KeyError
。
我怎么做?
该问题询问如何引发多个错误而不是捕获多个错误。
严格来说,您不能引发多个异常,但可以引发包含多个异常的对象。
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)
您可能会引发一个继承自ValueError
和的错误KeyError
。它会被任何一个 catch 块捕获。
class MyError(ValueError, KeyError):
...
是的,您可以处理多个错误,或者使用
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
@shrewmouse 的解决方案仍然需要选择一个异常类来包装捕获的异常。
finally
在一个异常发生后执行代码except
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”的热门搜索结果,我分享了我填补解决方案范围中(恕我直言相关)空白的方法。
您可以像这样引发多个异常:
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
try :
pass
except (ValueError,KeyError):
pass
阅读有关处理异常的更多信息