sách gpt4 ai đã đi

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

In lại Tác giả: Space Dog 更新时间:2023-10-29 18:32:30 29 4
mua khóa gpt4 Nike

Tôi biết 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 中不存在该函数。

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

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

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

Theo dõi (cuộc gọi gần đây nhất là cuộc gọi cuối cùng):
File ..., line ..., in ...
KeyError: '...'

During handling of the above exception, another exception occurred:

Theo dõi (cuộc gọi gần đây nhất là cuộc gọi cuối cùng):
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 可以是可调用的,只有在需要设置值时才会调用。有没有更好/规范的方法来做到这一点?)

1 Câu trả lời

这里有几个选项。

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

thử:
value = cache_dict[key]
except KeyError:
thử:
value = some_api.get_the_value(key)
ngoại trừ Ngoại lệ như e:
raise e from None
cache_dict[key] = value

对于第二个选项,我假设有一个Giá trị trả về隐藏在你没有显示的地方:

thử:
return cache_dict[key]
except KeyError:
vượt qua
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/

29 4 0
Bài viết được đề xuất: c# - 如何在 C# 中实现动态 OData 客户端?
Bài viết được đề xuất: c# - 将 WeakEventManager 与静态事件一起使用
Bài viết được đề xuất: c# - 将 C# 控制台应用程序位置设置为辅助屏幕
Bài viết được đề xuất: c# - 在派生类中强制声明属性
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com