我有一个 python 脚本,它在几个地方调用 log.error() 和 log.exception()。捕获这些异常以便脚本可以继续运行,但是,我希望能够确定是否曾经调用过 log.error() 和/或 log.exception(),以便我可以退出带有错误代码的脚本通过调用 sys.exit(1)。下面包括使用“错误”变量的简单实现。在我看来,必须有更好的方法。
error = False
try:
...
except:
log.exception("Something bad occurred.")
error = True
if error:
sys.exit(1)
Run Code Online (Sandbox Code Playgroud)
我遇到了与原始海报相同的问题:如果记录了任何错误或更严重的消息,我想退出我的 Python 脚本并显示错误代码。对于我的应用程序,只要不引发未处理的异常,就希望继续执行。但是,如果记录任何错误,持续集成构建应该会失败。
我找到了errorhandlerpython 包,它正是我们所需要的。请参阅GitHub、PyPI 页面和文档。
下面是我使用的代码:
import logging
import sys
import errorhandler
# Track if message gets logged with severity of error or greater
error_handler = errorhandler.ErrorHandler()
# Also log to stderr
stream_handler = logging.StreamHandler(stream=sys.stderr)
logger = logging.getLogger()
logger.setLevel(logging.INFO) # Set whatever logging level for stderr
logger.addHandler(stream_handler)
# Do your program here
if error_handler.fired:
logger.critical('Failure: exiting with code 1 due to logged errors')
raise SystemExit(1)
Run Code Online (Sandbox Code Playgroud)
我认为你的解决方案不是最好的选择。日志记录是脚本的一个方面,根据控制流返回错误代码是另一个方面。也许使用异常会是更好的选择。
但如果您想跟踪对日志的调用,您可以将其包装在装饰器中。装饰器的简单示例如下(没有继承或动态属性访问):
class LogWrapper:
def __init__(self, log):
self.log = log
self.error = False
def exception(self, message)
self.error = True
self.log.exception(message)
Run Code Online (Sandbox Code Playgroud)