python中的多个异常处理程序

时间:2015-05-27 10:04:35

标签: python exception-handling

我正在编写必须处理很多IndexError例外的代码 所以,我使用了try except块:

try:
    <do some level_1 calculations>
except IndexError:
    <change to level_2 calculations>  

但是,如果我的异常处理程序再次引发另一个IndexError怎么办? 如何安全地使用此代码结构添加另一个IndexError异常,以便,如果在IndexError中再次捕获level_2计算,则代码再次将“level_3计算”作为异常运行,依此类推。

4 个答案:

答案 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

这将尝试按给定的顺序执行函数,当它完成一个没有错误的步骤时,它将引发与先前级别相关的异常,因此您可以跟踪执行。

但正如我所说,这不是一个好的和正确的方式,除非你有非常具体的需求。