2024-12-22 15:02:42 +08:00
|
|
|
|
import sys
|
2025-08-07 00:31:24 +08:00
|
|
|
|
import os
|
|
|
|
|
|
import datetime
|
2025-08-11 17:54:14 +08:00
|
|
|
|
import traceback
|
2025-07-31 14:38:12 +08:00
|
|
|
|
from PySide6.QtWidgets import QApplication, QMessageBox
|
2025-07-16 16:18:39 +08:00
|
|
|
|
from main_window import MainWindow
|
2025-08-11 14:42:38 +08:00
|
|
|
|
from core.managers.privacy_manager import PrivacyManager
|
2025-08-11 17:54:14 +08:00
|
|
|
|
from utils.logger import setup_logger, cleanup_old_logs, log_uncaught_exceptions
|
2025-08-11 17:42:52 +08:00
|
|
|
|
from config.config import LOG_FILE, APP_NAME, LOG_RETENTION_DAYS
|
2025-08-07 00:31:24 +08:00
|
|
|
|
from utils import load_config
|
2024-12-22 15:02:42 +08:00
|
|
|
|
|
2025-08-11 17:54:14 +08:00
|
|
|
|
def excepthook(exc_type, exc_value, exc_traceback):
|
|
|
|
|
|
"""全局异常处理钩子,将未捕获的异常记录到日志并显示错误对话框"""
|
|
|
|
|
|
# 记录异常到日志
|
|
|
|
|
|
if hasattr(sys, '_excepthook'):
|
|
|
|
|
|
sys._excepthook(exc_type, exc_value, exc_traceback)
|
|
|
|
|
|
else:
|
|
|
|
|
|
log_uncaught_exceptions(exc_type, exc_value, exc_traceback)
|
|
|
|
|
|
|
|
|
|
|
|
# 将异常格式化为易读的形式
|
|
|
|
|
|
exception_text = ''.join(traceback.format_exception(exc_type, exc_value, exc_traceback))
|
|
|
|
|
|
|
|
|
|
|
|
# 创建错误对话框
|
|
|
|
|
|
msg = f"程序遇到未处理的异常:\n\n{str(exc_value)}\n\n详细错误已记录到日志文件。"
|
|
|
|
|
|
try:
|
|
|
|
|
|
# 尝试使用QMessageBox显示错误
|
|
|
|
|
|
app = QApplication.instance()
|
|
|
|
|
|
if app:
|
|
|
|
|
|
QMessageBox.critical(None, f"错误 - {APP_NAME}", msg)
|
|
|
|
|
|
except Exception:
|
|
|
|
|
|
# 如果QMessageBox失败,则使用标准输出
|
|
|
|
|
|
print(f"严重错误: {msg}")
|
|
|
|
|
|
print(f"详细错误: {exception_text}")
|
|
|
|
|
|
|
2025-02-05 21:08:56 +08:00
|
|
|
|
if __name__ == "__main__":
|
2025-08-07 00:31:24 +08:00
|
|
|
|
# 设置主日志
|
2025-07-31 14:38:12 +08:00
|
|
|
|
logger = setup_logger("main")
|
|
|
|
|
|
logger.info("应用启动")
|
|
|
|
|
|
|
2025-08-11 17:54:14 +08:00
|
|
|
|
# 设置全局异常处理钩子
|
|
|
|
|
|
sys._excepthook = sys.excepthook
|
|
|
|
|
|
sys.excepthook = excepthook
|
|
|
|
|
|
|
|
|
|
|
|
# 记录程序启动信息
|
|
|
|
|
|
logger.info(f"Python版本: {sys.version}")
|
|
|
|
|
|
logger.info(f"运行平台: {sys.platform}")
|
|
|
|
|
|
|
2025-08-07 00:31:24 +08:00
|
|
|
|
# 检查配置中是否启用了调试模式
|
|
|
|
|
|
config = load_config()
|
|
|
|
|
|
debug_mode = config.get("debug_mode", False)
|
|
|
|
|
|
|
2025-08-11 17:42:52 +08:00
|
|
|
|
# 在应用启动时清理过期的日志文件
|
|
|
|
|
|
cleanup_old_logs(LOG_RETENTION_DAYS)
|
|
|
|
|
|
logger.info(f"已执行日志清理,保留最近{LOG_RETENTION_DAYS}天的日志")
|
|
|
|
|
|
|
2025-08-07 00:31:24 +08:00
|
|
|
|
# 如果调试模式已启用,确保立即创建主日志文件
|
|
|
|
|
|
if debug_mode:
|
|
|
|
|
|
try:
|
|
|
|
|
|
# 确保log目录存在
|
|
|
|
|
|
log_dir = os.path.dirname(LOG_FILE)
|
|
|
|
|
|
if not os.path.exists(log_dir):
|
|
|
|
|
|
os.makedirs(log_dir, exist_ok=True)
|
|
|
|
|
|
logger.info(f"已创建日志目录: {log_dir}")
|
|
|
|
|
|
|
2025-08-11 17:42:52 +08:00
|
|
|
|
# 记录调试会话信息
|
|
|
|
|
|
logger.info(f"--- 新调试会话开始于 {os.path.basename(LOG_FILE)} ---")
|
|
|
|
|
|
logger.info(f"--- 应用版本: {APP_NAME} ---")
|
|
|
|
|
|
current_time = datetime.datetime.now()
|
|
|
|
|
|
formatted_date = current_time.strftime("%Y-%m-%d")
|
|
|
|
|
|
formatted_time = current_time.strftime("%H:%M:%S")
|
|
|
|
|
|
logger.info(f"--- 日期: {formatted_date} 时间: {formatted_time} ---")
|
2025-08-07 00:31:24 +08:00
|
|
|
|
|
|
|
|
|
|
logger.info(f"调试模式已启用,日志文件路径: {os.path.abspath(LOG_FILE)}")
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
logger.error(f"创建日志文件失败: {e}")
|
|
|
|
|
|
|
2025-07-16 16:18:39 +08:00
|
|
|
|
app = QApplication(sys.argv)
|
2025-07-31 10:59:42 +08:00
|
|
|
|
|
2025-07-31 14:38:12 +08:00
|
|
|
|
try:
|
|
|
|
|
|
privacy_manager = PrivacyManager()
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
logger.error(f"初始化隐私协议管理器失败: {e}")
|
2025-08-11 17:54:14 +08:00
|
|
|
|
logger.error(f"错误详情: {traceback.format_exc()}")
|
2025-07-31 14:38:12 +08:00
|
|
|
|
QMessageBox.critical(
|
|
|
|
|
|
None,
|
|
|
|
|
|
"隐私协议加载错误",
|
|
|
|
|
|
f"无法加载隐私协议管理器,程序将退出。\n\n错误信息:{e}"
|
|
|
|
|
|
)
|
|
|
|
|
|
sys.exit(1)
|
2025-07-31 10:59:42 +08:00
|
|
|
|
|
|
|
|
|
|
if not privacy_manager.show_privacy_dialog():
|
2025-07-31 14:38:12 +08:00
|
|
|
|
logger.info("用户未同意隐私协议,程序退出")
|
2025-08-04 12:46:59 +08:00
|
|
|
|
sys.exit(0)
|
2025-07-31 10:59:42 +08:00
|
|
|
|
|
2025-07-31 14:38:12 +08:00
|
|
|
|
logger.info("隐私协议已同意,启动主程序")
|
2025-07-15 16:30:50 +08:00
|
|
|
|
window = MainWindow()
|
2024-12-22 15:02:42 +08:00
|
|
|
|
window.show()
|
2025-08-11 16:14:34 +08:00
|
|
|
|
sys.exit(app.exec())
|