在python

时间:2017-06-25 11:51:31

标签: python python-3.x exception-handling

我在python中有一些异常处理代码,其中可以引发两个异常,第一个异常是第二个的“超集”。

即。以下代码总结了我需要做的事情(并且工作正常)

try:
    normal_execution_path()
except FirstError:
    handle_first_error()
    handle_second_error()
except SecondError:
    handle_second_error()

但是它要求我将所有内容抽象为独立的函数,以使代码保持干净和可读。我正在跳过一些更简单的语法,如:

try:
    normal_execution_path()
except FirstError:
    handle_first_error()
    raise SecondError
except SecondError:
    handle_second_error()

但这似乎不起作用(SecondError如果在此块中引发则不会被重新捕获)。那方面有什么可行的吗?

2 个答案:

答案 0 :(得分:0)

如果您希望手动抛出要处理的第二个错误,可以使用嵌套的try-catch块,如下所示:

try:
    normal_execution_path()
except FirstError:
    try:
        handle_first_error()
        raise SecondError
    except SecondError:
        handle_second_error()
except SecondError:
        handle_second_error()

答案 1 :(得分:-1)

也许值得回顾一下代码架构。但是对于你的具体情况:

创建一个处理此类错误的泛型类。从第一个和第二个错误情况继承它。为此类错误创建处理程序。在处理程序中,检查第一个或第二个特例并用瀑布处理它。

class SupersetException(Exception):
    pass


class FirstError(SupersetException):
    pass


class SecondError(SupersetException):
    pass


def normal_execution_path():
    raise SecondError


def handle_superset_ex(state):
    # Our waterfall
    # We determine from whom the moment to start processing the exception.
    if type(state) is FirstError:
        handle_first_error()
    # If not the first, the handler above will be skipped 
    handle_second_error()


try:
    normal_execution_path()
except SupersetException as state:
    handle_superset_ex(state)

然后开发这个想法。