重新引发异常,以便在同一个b

2024-10-01 13:36:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样的代码:

try:
    # do stuff
except SomeSpecificException as sse:
    if sse.some_property == some_special_value:
        # handle the exception in a special way
    else:
        handle_exception_normally()
except:
    handle_exception_normally()

我希望捕获特定的异常并以特殊的方式处理它,但前提是它具有特定的属性。如果它没有这个属性,我希望它能像处理其他异常(日志、尖叫等)一样被处理

上面的代码可以工作,但是如果可能的话,我希望避免重复handle_exception_normally()DRY以及所有这些)。你知道吗

仅仅把raise放在第一个except块的else子句中是行不通的。一个父try块会捕获它,但是同一块中的catch all子句不会。你知道吗

我可以嵌套两个try块,但它不是很优雅;我宁愿只使用 上面的代码。你知道吗

有更好的办法吗?你知道吗

注意,我使用的是python3。你知道吗


Tags: 代码属性exceptionsomedoelsessespecial
2条回答

我会选择:

try:
    # do stuff
except Exception as e:
    if e.args[0] == 'Discriminate Exception Here' and sse.some_property == some_special_value:
        # handle the exception in a special way
    else:
        handle_exception_normally()

Moses Koledoye建议:

try:
    # do stuff
except Exception as e:
    if getattr(e, 'some_property', None) == some_special_value:
        # handle the exception in a special way
    else:
        handle_exception_normally()

它较短,但需要一些特殊的值始终是!= None,并且属性对于异常是唯一的。你知道吗

例外歧视的例子,用e.args[0]

try:
 5 / 0
except Exception as e:
 print(e.args[0])

division by zero

使用__class__.__name__

try:
 5 / 0
except Exception as e:
 print(e.__class__.__name__)

ZeroDivisionError

使用isinstance()(CPU密集型)时:

try:
 5 / 0
except Exception as e:
 isinstance(e, ZeroDivisionError)

True

我知道OP说他们不想这样做,但我要用嵌套的try块。我认为这是最具可读性的方法:

try:
    try:
        # do stuff
    except SomeSpecificException as sse:
        if sse.some_property == some_special_value:
            # handle the exception in a special way
        else:
            raise
except:
    handle_exception_normally()

相关问题 更多 >