You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kivy Logger在PYTHON模式下将Python异常识别为警告的问题求助

解决Kivy未捕获异常被标记为WARNING级别的问题

问题原因

当设置Logger.mode = "PYTHON"时,Kivy的Logger会捕获标准错误流(stderr)的输出,并默认以WARNING级别记录。未被捕获的Python异常会输出到stderr,因此被Kivy Logger拦截后标记为WARNING,即使程序已经终止。

解决方案

方案1:修改Kivy Logger的stderr日志级别

直接调整Kivy Logger中stderr logger的级别,将其从WARNING改为ERROR:

import logging
logging.basicConfig(
    filename = "log.log",
    filemode = "w",
    encoding = "utf-8",
    force = True,
    level = logging.INFO,
    format = "%(asctime)s %(levelname)-8s %(message)s",
    datefmt = "%Y-%m-%d %H:%M:%S"
)

from kivy.logger import Logger, LOG_LEVELS
Logger.mode = "PYTHON"
# 修改stderr logger的级别为ERROR
Logger.setLevel('stderr', LOG_LEVELS['error'])

方案2:用Python logging接管未处理异常

通过Python logging模块结合sys.excepthook接管未捕获异常的处理,确保异常以ERROR级别记录,同时避免被Kivy Logger以WARNING捕获:

import logging
import sys

def handle_uncaught_exception(exc_type, exc_value, exc_traceback):
    if issubclass(exc_type, KeyboardInterrupt):
        # 保留键盘中断的默认处理逻辑
        sys.__excepthook__(exc_type, exc_value, exc_traceback)
        return
    # 以ERROR级别记录完整异常信息
    logging.error("未捕获的异常", exc_info=(exc_type, exc_value, exc_traceback))

sys.excepthook = handle_uncaught_exception

logging.basicConfig(
    filename = "log.log",
    filemode = "w",
    encoding = "utf-8",
    force = True,
    level = logging.INFO,
    format = "%(asctime)s %(levelname)-8s %(message)s",
    datefmt = "%Y-%m-%d %H:%M:%S"
)

from kivy.logger import Logger
Logger.mode = "PYTHON"

配置后,未捕获的异常会直接通过Python logging以ERROR级别写入日志,不会被Kivy Logger转为WARNING。

方案3:禁用Kivy对stderr的捕获

如果不需要Kivy处理stderr输出,可以直接关闭该功能,但需结合方案2才能将异常记录到日志文件:

import logging
import sys

def handle_uncaught_exception(exc_type, exc_value, exc_traceback):
    if issubclass(exc_type, KeyboardInterrupt):
        sys.__excepthook__(exc_type, exc_value, exc_traceback)
        return
    logging.error("未捕获的异常", exc_info=(exc_type, exc_value, exc_traceback))

sys.excepthook = handle_uncaught_exception

logging.basicConfig(
    filename = "log.log",
    filemode = "w",
    encoding = "utf-8",
    force = True,
    level = logging.INFO,
    format = "%(asctime)s %(levelname)-8s %(message)s",
    datefmt = "%Y-%m-%d %H:%M:%S"
)

from kivy.logger import Logger
Logger.mode = "PYTHON"
# 关闭Kivy对stderr的捕获
Logger.stderr = False

内容的提问来源于stack exchange,提问作者Abel Gutiérrez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 23:30:19