我遇到了一个非常标准的问题,想知道我的解决方案是否正确。
每次发生异常我希望它被呼叫者捕获并记录,然后重新引发。
由于我不想每次都重复记录消息,因此我创建了一个自定义异常,该异常可以保存消息数据并记录日志。
class LoggingException(Exception):
def __init__(self, message, package_id):
# Get caller informat
caller = getframeinfo(stack()[2][0])
self.filename = caller.filename
self.function = caller.function
# Set message info and log
self.message = message
if (LogManager.log_handler is None):
print(message)
else:
LogManager.l(package_id, LogLevelEnum.ERROR, message)
用例:
def main_func():
try:
secondary_func()
except Exception as ex:
raise LoggingException("Some log") from ex
def secondary_func():
raise LoggingException("Exception info")
问题是不能完全确定是否有例外可以执行任何操作,这对于它没有标准的python解决方案来说是普遍的。
注意:由于产品的限制,我没有使用python日志记录模块。
答案 0 :(得分:2)
试图获得类似这样的呼叫者信息将是不可靠的。另外,在某些情况下,您可能不是直接呼叫者。
异常日志记录本身的想法似乎很明智。为了妥协,我会将日志记录功能移到可以显式触发的单独方法中。毕竟,例外是大多数常规对象:
class LoggingException(Exception):
def __init__(self, message, package_id):
# Set message info
super.__init__(message)
self.package_id = package_id
def log(self, manager=None):
if manager.log_handler is None:
print(super().__str__())
else:
manager.l(self.package_id, LogLevelEnum.ERROR, super()..__str__())
现在,您可以随时触发记录操作,而不必重建消息:
try:
...
except LoggingException as e:
e.log(some_manager)
raise
这使您可以选择重新引发错误(如此处所示),或像示例中那样将其链接。除非您有充分的理由这样做,否则我强烈建议您不要使用链接。