如何隐藏未处理异常的控制台输出?仅保留Loguru日志
解决方法
方案1:自定义无消息异常类
重抛时使用一个自定义异常类,让它的__str__方法返回空字符串,这样即便Python输出异常消息,也不会显示内容。同时保留原异常对象,确保Elastic能获取完整的异常信息。
import sys from loguru import logger # 自定义哑异常,不输出任何消息 class SilentException(Exception): def __init__(self, original_exc): self.original_exc = original_exc super().__init__() def __str__(self): return "" # 示例业务代码 def risky_operation(): raise ValueError("这是一个测试异常") try: risky_operation() except Exception as e: # 用Loguru记录完整异常信息 logger.exception("捕获到异常") # 重抛自定义哑异常,切断异常链避免回溯关联 raise SilentException(e) from None
方案2:临时过滤stderr输出
先将Loguru的默认输出改为stdout,避免被stderr重定向影响;再在重抛异常的瞬间,用自定义的过滤对象替换sys.stderr,拦截异常相关的输出行。
import sys from loguru import logger from io import StringIO # 把Loguru输出定向到stdout,避开stderr的过滤逻辑 logger.remove() logger.add(sys.stdout, format="{time} {level} {message}") class FilteredStderr(StringIO): def write(self, data): # 过滤掉异常回溯和消息行 if not (data.startswith("Traceback") or data.strip().endswith("Exception:")): super().write(data) def risky_operation(): raise ValueError("测试异常") try: risky_operation() except Exception as e: logger.exception("捕获到异常") # 临时替换stderr为过滤对象 original_stderr = sys.stderr sys.stderr = FilteredStderr() try: raise e from None finally: sys.stderr = original_stderr
方案3:临时重定向stderr到/dev/null
重抛异常时,短暂将sys.stderr定向到/dev/null,完成后恢复原stderr,彻底屏蔽异常输出。注意先调整Loguru输出到stdout,避免日志被一并屏蔽。
from loguru import logger import sys # 调整Loguru输出到stdout logger.remove() logger.add(sys.stdout, format="{time} {level} {message}") def risky_operation(): raise ValueError("测试异常") try: risky_operation() except Exception as e: logger.exception("捕获到异常") # 临时重定向stderr到空设备 original_stderr = sys.stderr sys.stderr = open("/dev/null", "w") try: raise e from None finally: sys.stderr.close() sys.stderr = original_stderr
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

