我正在编写必须处理很多IndexError
例外的代码
所以,我使用了try except
块:
try:
<do some level_1 calculations>
except IndexError:
<change to level_2 calculations>
但是,如果我的异常处理程序再次引发另一个IndexError
怎么办?
如何安全地使用此代码结构添加另一个IndexError
异常,以便,如果在IndexError
中再次捕获level_2计算,则代码再次将“level_3计算”作为异常运行,依此类推。
答案 0 :(得分:4)
您可以嵌套try except
块,如下所示:
try:
<do some level_1 calculations>
except IndexError:
try:
<change to level_2 calculations>
except IndexError:
try:
<change to level_3 calculations>
except IndexError:
<change to level_4 calculations>
但是这看起来很麻烦,如果你弄乱了格式化会造成麻烦,最好使用循环的函数列表尝试不同的计算,直到所有失败然后你以其他方式处理异常。
calulators = [
level_1_calculation_function,
level_2_calculation_function,
level_3_calculation_function,
]
for attempt in range(len(calculators)):
try:
result = calculators[attempt]
break #If we've reached here, the calculation was successful
except IndexError:
attempt += 1
else:
#If none of the functions worked and broke out of the loop, we execute this.
<handle_exception>
答案 1 :(得分:1)
将calculate / func放在列表中:
from random import choice
from operator import mul, add
funcs = [mul, add]
for f in funcs:
try:
i = l[choice([1, 2, 3])]
calc = f(i[0], i[1])
print(calc)
break # break if you want the first successful calc to be the last
except IndexError as e:
print(e)
continue
如果你运行代码,你会看到随机的indexError被捕获。
答案 2 :(得分:0)
通常,在编写代码时,您应该了解在任何阶段可能发生的事情,并且应该相应地放置异常处理程序。
如果您正在执行一系列操作,其中有多个位置可能导致特定异常,则可以将整个块封装到适当类型的单个异常处理程序中。在其他情况下,当您因某些其他异常而需要不同的行为时,请定义单独的处理程序。
这两种方式在逻辑上都是正确的,而不是设计问题。
答案 3 :(得分:0)
嵌套try-except块是正确的方法。因为可能的异常发生在您的try块的外部。
还有另外一种方式,但如果您没有非常具体的理由使用它,我会建议您。它使事情看起来更混乱,并要求你使用嵌套在彼此之间的默认try-except块,并使用最终的try-except块来覆盖它们!
class FirstLevelFuncException(Exception):
pass
class SecondLevelFuncException(Exception):
pass
class ThirdLevelFuncException(Exception):
pass
try:
# This is the base try block that will cover your code and catch Function Level based exceptions
try:
<do some level_1 calculations>
except IndexError:
try:
<change to level_2 calculations>
except IndexError:
try:
<change to level_3 calculations>
except IndexError:
<change to level_4 calculations>
else:
raise SecondLevelFuncException()
else:
raise FirstLevelFuncException()
else:
pass
except Exception as e:
print e
这将尝试按给定的顺序执行函数,当它完成一个没有错误的步骤时,它将引发与先前级别相关的异常,因此您可以跟踪执行。
但正如我所说,这不是一个好的和正确的方式,除非你有非常具体的需求。