gpt4 book ai didi

python - 重新引发异常,以便在同一个 block 中处理

转载 作者:行者123 更新时间:2023-11-28 21:41:04 25 4
gpt4 key购买 nike

我的代码有点像这样:

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 block 的 else 子句中是行不通的。父 try block 会捕获它,但同一 block 中的 catch-all 子句不会。

我可以嵌套两个 try block ,但这不是很优雅;我宁愿只使用我上面的代码。

有没有更好的办法?

请注意,我使用的是 Python 3。

最佳答案

我会选择:

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()

它更短,但要求 some_special_value 始终为 != 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

关于python - 重新引发异常,以便在同一个 block 中处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45109971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com