gpt4 book ai didi

python - 如何抑制显示后续异常的父异常(原因)

转载 作者:太空狗 更新时间:2023-10-29 18:32:30 27 4
gpt4 key购买 nike

我知道 raise ... from None 并已阅读 How can I more easily suppress previous exceptions when I raise my own exception in response? .

但是,如何在不控制从 except 子句执行的代码的情况下实现相同的效果(抑制“在处理上述异常期间,发生另一个异常”消息)?我认为 sys.exc_clear() 可以用于此目的,但 Python 3 中不存在该函数。

我为什么要问这个?我有一些简单的缓存代码,看起来像(简化):

try:
value = cache_dict[key]
except KeyError:
value = some_api.get_the_value_via_web_service_call(key)
cache_dict[key] = value

当API调用出现异常时,输出会是这样的:

Traceback (most recent call last):
File ..., line ..., in ...
KeyError: '...'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File ..., line ..., in ...
some_api.TheInterestingException: ...

这是误导,因为原来的 KeyError 根本不是真正的错误。我当然可以通过将 try/except (EAFP) 更改为对 key 存在的测试 (LBYL) 来避免这种情况,但这不是很 Pythonic 并且线程友好性较低(并不是说上面是线程安全的,但那是题外话)。

期望 some_api 中的所有代码将它们的 raise X 更改为 raise X from None 是不合理的(而且它甚至在所有情况下都没有意义)。是否有一个干净的解决方案来避免错误消息中不需要的异常链?

(顺便说一下,奖励问题:我在示例中使用的缓存基本上等同于 cache_dict.setdefault(key, some_api.get_the_value_via_web_service_call(key)),如果只有第二个参数setdefault 可以是可调用的,只有在需要设置值时才会调用。有没有更好/规范的方法来做到这一点?)

最佳答案

这里有几个选项。

首先,orlp 建议的更清晰的版本:

try:
value = cache_dict[key]
except KeyError:
try:
value = some_api.get_the_value(key)
except Exception as e:
raise e from None
cache_dict[key] = value

对于第二个选项,我假设有一个返回值隐藏在你没有显示的地方:

try:
return cache_dict[key]
except KeyError:
pass
value = cache_dict[key] = some_api.get_the_value(key)
return value

第三个选项,LBYL:

if key not in cache_dict:
cache_dict[key] = some_api.get_the_value(key)
return cache_dict[key]

对于奖金问题,定义你自己的定义__missing__的dict子类:

class MyCacheDict(dict):

def __missing__(self, key):
value = self[key] = some_api.get_the_value(key)
return value

希望这对您有所帮助!

关于python - 如何抑制显示后续异常的父异常(原因),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30235516/

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