繁体   English   中英

立即在python中重新引发并重新捕获错误

[英]Re-raise and re-catch error immediately in python

我在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则不会重新SecondError它)。 在这个方向上有什么可行的吗?

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

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

也许值得回顾一下代码体系结构。 但是对于您的特殊情况:

创建一个处理此类错误的通用类。 从第一个和第二个错误案例继承自它。 为这种类型的错误创建一个处理程序。 在处理程序中,检查第一种或第二种特殊情况,并使用瀑布对其进行处理。

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)

然后只是提出想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM