【发布时间】:2009-07-27 08:40:55
【问题描述】:
我想在 Python (2.6) 中编写一个函数,该函数可以确定它是否被堆栈上某处的异常处理代码调用。
这是专门用于日志记录的。在 python 的logging 模块中,调用者必须明确指定应记录异常信息(通过调用logger.exception() 或使用exc_info 关键字)。我希望我的记录器自动执行此操作,具体取决于是否从异常处理代码中调用它。
我认为检查 sys.exc_info() 可能是答案,但它也会从已处理的异常中返回异常信息。 (来自docs:“此函数返回一个包含三个值的元组,这些值提供有关当前正在处理的异常的信息……如果当前堆栈帧未处理异常,则该信息取自调用堆栈帧,或其调用者,依此类推,直到找到正在处理异常的堆栈帧。这里,“处理异常”定义为“正在执行或已执行除了子句。'")
另外,由于我希望这对调用者透明,我不想在 except 子句中使用 exc_clear() 或其他任何内容。
这样做的正确方法是什么?
【问题讨论】:
-
调用上下文怎么可能不明确?您定义了一个要从异常中调用的函数。它总是从异常中调用。有什么问题?请说明为什么设计为从异常中调用的函数不会从异常中调用。
-
我没有将其定义为要从异常中调用的函数。它是一个可以从异常调用或从非异常调用的函数。我想确定是哪种情况。
-
Ummm... 定义你的函数有什么问题,所以它必须从异常中调用?是什么阻止您更改函数定义以简化此操作?
-
或将您的函数“分叉”为两部分:一个仅从异常处理程序调用,另一个在所有其他情况下调用(如果我理解正确的话)。