Eclipse RCP中CustomMigration异常处理及编辑器打开控制方案
Eclipse RCP 模型迁移失败引发编辑器故障的解决方案
核心问题明确答复
- 该类迁移失败导致的编辑器连锁故障完全可以规避
- 框架原生支持迁移失败时中止编辑器打开流程,无需修改RCP底层源码
- 支持在编辑器窗口渲染前提前执行模型迁移逻辑,甚至可以将校验时机进一步前置
具体落地实现
1. 前置模型迁移执行时机
默认绑定在编辑器打开流程中的CustomMigration触发时机过晚,要把迁移逻辑挪到编辑器生命周期最前端:
- 重写对应业务编辑器的
IEditorPart#init()方法,在调用super.init()之前就完成模型文件读取、版本校验、全量迁移流程,这一阶段编辑器尚未创建任何UI控件,完全不会触发渲染逻辑 - 迁移执行前先对原模型文件做临时备份,避免迁移中途异常损坏用户存量数据
- 如果要进一步提前校验时机,可以把迁移逻辑绑定到对应文件类型的
IEditorLauncher实现中,用户双击文件时就先做迁移校验,校验不通过直接弹提示,根本不会走编辑器启动流程
2. 迁移失败时正确中止打开流程
迁移过程捕获到任何异常时,不要吞异常继续执行后续编辑器初始化逻辑,按以下步骤处理:
- 立即终止迁移流程,用之前的备份文件恢复原模型文件,避免脏数据残留
- 弹出模态提示框告知用户迁移失败的具体原因,比如文件损坏、跨版本跨度不在支持范围内、文件被占用等
- 直接抛出
PartInitException异常,这是RCP框架原生定义的编辑器初始化失败信号,框架捕获到该异常后会直接中断整个编辑器打开流程,清理已初始化的资源,不会继续渲染编辑器窗口,从根源上避免空指针、窗口损坏这类连锁异常
注意:不要抛出自定义RuntimeException这类非框架识别的异常,否则框架不会走打开失败的兜底逻辑,依然会继续执行后续UI初始化流程
3. 增加兜底校验逻辑
为了避免个别路径漏过校验,再加两层兜底:
- 在编辑器
createPartControl()方法的第一行增加模型合法性校验,如果检测到模型实例为空、版本不匹配,直接调用getSite().getPage().closeEditor(this, false)关闭当前未完成初始化的编辑器,同时弹出错误提示 - 给
CustomMigration实现类增加统一的异常拦截,所有迁移过程抛出的异常都统一包装后向上抛到编辑器初始化入口,严禁在迁移逻辑内部吞掉异常不处理
常见避坑点
- 不要把迁移逻辑放在
createPartControl()及之后的UI生命周期节点执行,这个阶段已经开始创建SWT控件,一旦模型实例缺失,必然触发UI组件空指针异常 - 迁移过程不要直接写入原文件,先写入临时文件,等全量迁移完成、模型合法性校验通过后,再替换原文件,避免迁移中途崩溃导致用户文件彻底损坏
- 如果有多个编辑器关联同类型业务模型,把迁移、版本校验逻辑抽到公共的模型加载工具类中,所有编辑器打开文件前统一走公共校验逻辑,避免重复实现导致的逻辑不一致
内容的提问来源于stack exchange,提问作者bierpreis
相关产品推荐
相关产品推荐

