隐藏未处理异常的所有控制台输出

问题描述 投票:0回答:1

我捕获所有异常并使用 loguru 记录器记录它们。然后我必须重新引发相同的异常以使该步骤失败并将信息发送到弹性。

from loguru import logger

@when('some step ...')
def do_something(context, ...):
   try:
       ...
   except Exception as e:
     save_traceback_to_log_file()
     logger.error("Example exception log.")
     raise e

------------------------
Console output:
...
... Example exception log.

我只想查看 loguru 的日志。我不希望在控制台输出中引发未处理的异常而产生任何异常的回溯或消息。

我能够通过以下方式使回溯保持沉默:

@contextmanager
def disable_traceback():
    default_value = getattr(sys, "tracebacklimit", 1000)
    sys.tracebacklimit = 0
    yield
    sys.tracebacklimit = default_value
    ...
    with disable_traceback():
      raise e

但我仍然在控制台输出中收到不需要的异常消息:

引发异常(“一些消息......”)

04.12.1999  15:36:47.153 | ERROR    | ... - Exception - Some message...
    When executing the system test "..." ... failed in 0.503s
Exception: Some message...   << don't want

这些似乎都不起作用:sys.excepthook、使用 open(os.devnull, 'w') 沉默 Python 的 stderr、捕获装饰器

我该怎么做?

python python-3.x exception cucumber python-behave
1个回答
0
投票

不知道为什么

sys.excepthook
不适合你,但这正是你正在寻找的,恕我直言。请参阅下面的简单示例。

注意

sys.excepthook
不适用于 IPython。请参阅这个问题。

import sys
from loguru import logger


def exception_handler(type, value, traceback):
   pass
sys.excepthook = exception_handler

def func():
   try:
     1/0
   except Exception as ex:
     logger.error("error hello")
     raise ex

func()

输出:

2024-01-07 12:12:11.791 | ERROR    | __main__:func:13 - error hello
© www.soinside.com 2019 - 2024. All rights reserved.