【发布时间】:2015-07-25 23:05:39
【问题描述】:
我知道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) 更改为对密钥是否存在的测试 (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 的第二个参数可以是仅在需要设置值时才调用的可调用对象. 没有更好/规范的方法吗?)
【问题讨论】:
-
这个
defaultdict修改应该对你有用:stackoverflow.com/questions/2912231/…
标签: python exception python-3.x exception-handling