有没有办法通过使用try和except来同时引发两个错误?
例如,ValueError
和KeyError
。
我该怎么做?
答案 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)
您可能会引发一个继承自ValueError
和KeyError
的错误。它会被一个捕获块捕获。
class MyError(ValueError, KeyError):
...
答案 2 :(得分:2)
try :
pass
except (ValueError,KeyError):
pass
答案 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的解决方案仍然需要选择一个异常类来包装捕获的异常。
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
如果您有一个任务需要对列表的每个元素完成,则无需事先收集异常。这是带有多个错误报告的多个文件删除的示例:
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