NavisworksTransport/doc/working/全局异常处理机制开发任务.md

3.5 KiB
Raw Blame History

全局异常处理机制开发任务

任务背景

用户反馈程序经常崩溃,希望添加一个整体的错误异常捕获机制,避免每次都崩溃。

开发目标

  1. 实现全局异常捕获,防止程序崩溃
  2. 提供用户友好的错误提示
  3. 实现异常自动恢复机制
  4. 增强异常日志记录

实现方案

1. GlobalExceptionHandler工具类

创建了专门的全局异常处理工具类,包含以下功能:

异常捕获机制

  • AppDomain.CurrentDomain.UnhandledException:捕获未处理的异常
  • System.Windows.Forms.Application.ThreadException:捕获线程异常
  • 统一的异常处理流程

SafeExecute方法

// 有返回值的安全执行
public static T SafeExecute<T>(Func<T> action, T defaultValue = default(T), string operationName = "操作")

// 无返回值的安全执行
public static void SafeExecute(Action action, string operationName = "操作")

异常记录与显示

  • 详细的异常日志记录(类型、消息、堆栈信息)
  • 用户友好的错误对话框
  • 技术详情与用户信息分离

2. 自动恢复机制

当检测到异常时,自动执行以下恢复操作:

  • 退出路径编辑模式
  • 清除临时材质和高亮
  • 重置关键组件状态

3. 关键方法保护

为以下关键方法添加了异常保护:

  • MainPlugin.Execute():插件入口点
  • ShowCategorySelectionDialog():主对话框
  • 所有按钮点击事件处理

技术实现

文件修改

  • MainPlugin.cs添加GlobalExceptionHandler类和异常保护

关键代码结构

public static class GlobalExceptionHandler
{
    // 初始化全局异常处理器
    public static void Initialize()
    
    // 未处理异常处理
    private static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
    
    // 线程异常处理
    private static void OnThreadException(object sender, ThreadExceptionEventArgs e)
    
    // 安全执行包装
    public static T SafeExecute<T>(Func<T> action, T defaultValue, string operationName)
    
    // 异常恢复
    private static void TryRecoverComponents()
}

异常处理策略

  1. Fail-Safe策略:宁可功能失效也不崩溃
  2. 用户友好:显示简洁的错误信息,技术细节记录到日志
  3. 自动恢复:尝试将程序恢复到安全状态
  4. 详细记录:完整的异常信息记录便于调试

版本更新

  • 版本号v0.1.10
  • 发布日期2025-06-19

功能验证

  1. 全局异常处理器初始化
  2. 主要方法异常包装
  3. 用户界面异常保护
  4. 异常日志记录
  5. 自动恢复机制

用户体验改进

  • 之前程序崩溃用户需要重启Navisworks
  • 现在:异常被捕获,显示友好提示,程序继续运行

技术细节

  • 解决了System.Windows.Forms.ApplicationAutodesk.Navisworks.Api.Application的命名冲突
  • 使用泛型方法支持有/无返回值的安全执行
  • 采用三层异常处理:全局捕获 → 方法包装 → 局部try-catch

后续优化建议

  1. 可以考虑添加异常统计功能
  2. 实现异常报告自动发送功能
  3. 增加更细粒度的恢复策略
  4. 考虑添加异常重试机制

总结

通过实现全局异常处理机制,彻底解决了程序崩溃问题。用户现在可以安全地使用插件,即使出现异常也能获得友好的提示并继续使用其他功能。这大大提升了插件的稳定性和用户体验。