81 lines
2.4 KiB
Python
81 lines
2.4 KiB
Python
import sys
|
|
import tkinter as tk
|
|
|
|
from loguru import logger
|
|
|
|
from ui.app_window import ReportApp
|
|
from utils.log_handler import setup_logging
|
|
|
|
# 全局变量,用于判断日志是否已初始化
|
|
LOGGING_INITIALIZED = False
|
|
|
|
|
|
# --- 全局错误处理 ---
|
|
def handle_exception(exc_type, exc_value, exc_traceback):
|
|
"""
|
|
捕获未被 try/except 块处理的全局异常(如线程崩溃)。
|
|
"""
|
|
if exc_type is KeyboardInterrupt:
|
|
sys.__excepthook__(exc_type, exc_value, exc_traceback)
|
|
return
|
|
|
|
# 尝试使用 loguru 记录
|
|
if LOGGING_INITIALIZED:
|
|
logger.error("捕获到未处理的全局异常:", exc_info=(exc_type, exc_value, exc_traceback))
|
|
else:
|
|
# 如果日志系统未初始化,直接打印到标准错误流,确保用户看到
|
|
print("FATAL ERROR (Log Not Initialized):", file=sys.stderr)
|
|
import traceback
|
|
traceback.print_exception(exc_type, exc_value, exc_traceback, file=sys.stderr)
|
|
|
|
|
|
sys.excepthook = handle_exception
|
|
|
|
|
|
# --------------------
|
|
|
|
|
|
def create_main_window():
|
|
global LOGGING_INITIALIZED
|
|
|
|
# 顶级 try 块,捕获日志初始化阶段的错误
|
|
try:
|
|
# 1. 初始化日志
|
|
setup_logging()
|
|
LOGGING_INITIALIZED = True
|
|
logger.info("正在启动应用程序...")
|
|
|
|
# 2. 启动 UI
|
|
root = tk.Tk()
|
|
|
|
# 这一行可以设置图标 (如果有 icon.ico 文件)
|
|
# root.iconbitmap(os.path.join(os.path.dirname(__file__), "public", "icon.ico"))
|
|
|
|
# 确保 ReportApp 实例化时不会出现路径错误
|
|
app = ReportApp(root)
|
|
|
|
# 3. 进入主循环
|
|
root.mainloop()
|
|
|
|
except Exception as e:
|
|
# 如果日志系统已启动,使用 logger 记录
|
|
if LOGGING_INITIALIZED:
|
|
logger.error(f"应用程序启动/主循环出错: {e}", exc_info=True)
|
|
else:
|
|
# 如果日志系统未初始化,直接打印到控制台
|
|
print(f"FATAL STARTUP ERROR: {e}", file=sys.stderr)
|
|
import traceback
|
|
traceback.print_exc(file=sys.stderr)
|
|
|
|
# 确保窗口被销毁
|
|
if 'root' in locals() and root:
|
|
root.destroy()
|
|
|
|
# 非窗口模式下,在启动错误时等待用户查看
|
|
if not getattr(sys, 'frozen', False) or not any(arg in sys.argv for arg in ('--windowed', '-w')):
|
|
input("按任意键退出...")
|
|
sys.exit(1)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
create_main_window() |