gpt4 book ai didi

python - 如何将上下文添加到 Python 中的异常

转载 作者:太空狗 更新时间:2023-10-29 20:26:07 24 4
gpt4 key购买 nike

我想为这样的异常添加上下文:

def process(vals):
for key in vals:
try:
do_something(vals[key])
except Exception as ex: # base class. Not sure what to expect.
raise # with context regarding the key that was being processed.

我发现了一种对于 Python 来说异常冗长的方法。还有比这更好的方法吗?

try:
do_something(vals[key])
except Exception as ex:
args = list(ex.args)
if len(args) > 1:
args[0] = "{}: {}".format(key, args[0])
ex.args = tuple(args)
raise # Will re-trhow ValueError with new args[0]

最佳答案

ex.args 中的第一项始终是消息——如果有的话。 (注意一些异常,例如 assert False 引发的异常,ex.args 是一个空元组。)

我不知道还有比将新元组重新分配给 ex.args 更简洁的修改消息的方法。 (我们不能修改元组,因为元组是不可变的)。

下面的代码与你的代码类似,除了它构造元组时没有使用中间列表,它处理了 ex.args 为空的情况,并且为了使代码更具可读性,它隐藏了上下文管理器中的样板:

import contextlib

def process(val):
with context(val):
do_something(val)

def do_something(val):
# assert False
return 1/val

@contextlib.contextmanager
def context(msg):
try:
yield
except Exception as ex:
msg = '{}: {}'.format(msg, ex.args[0]) if ex.args else str(msg)
ex.args = (msg,) + ex.args[1:]
raise

process(0)

产生一个堆栈跟踪,以此作为最终消息:

ZeroDivisionError: 0: division by zero

关于python - 如何将上下文添加到 Python 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17677680/

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