如何通过DXL规避加载含无效筛选器视图时的错误弹窗?
解决DOORS 9.7中DXL分析视图时的无效筛选器弹窗问题
方案一:提前排查无效视图(推荐)
核心想法是在加载视图前,先解析视图的筛选器配置,找出那些引用了已删除枚举的视图,直接跳过不处理,从根源上避免弹窗。
具体实现步骤
- 遍历模块里的所有视图,拿到每个视图的筛选器字符串:
Module m = current View v for v in m do { string filterStr = v."filter" // 接下来解析这个字符串检查无效枚举 } - 先把模块里现存的所有枚举类型存到一个集合里:
Skip validEnums = create() Type t for t in m do { if (type(t) == typeEnum) { put(validEnums, name(t), true) } } - 解析筛选器字符串,找出里面的枚举引用,对比有效枚举集合,发现不在里面的就跳过该视图:
// 用正则匹配筛选器里的枚举名(示例匹配"EnumName="这种格式) RegExp enumRegex = regexp2("([A-Za-z0-9_]+)=") if (enumRegex.search(filterStr)) { string enumName = enumRegex.group(1) if (!find(validEnums, enumName)) { print "跳过无效视图:" name(v) "\n" continue } } // 没问题再加载视图做分析 load(v) // ... 你的分析逻辑代码
方案二:拦截错误弹窗(兼容9.7的替代方案)
之前9.6用的“设默认视图+不可见打开”在9.7会崩溃,可以试试用DXL的自定义错误处理来拦截弹窗:
- 写一个错误处理函数,专门拦截视图筛选器相关的错误:
void suppressFilterError(int errCode, char *errMsg) { // 匹配无效筛选器的错误提示,根据你的DOORS语言版本调整文本 if (errMsg contains "无效筛选器" || errMsg contains "枚举类型不存在") { print "忽略错误:" errMsg "\n" return } // 其他错误还是用默认处理 defaultErrorProc(errCode, errMsg) } // 启用自定义错误处理 errorProc(suppressFilterError) // 不可见打开模块(注意路径替换成你的) Module targetMod = read("/项目路径/目标模块", false) View v for v in targetMod do { load(v) // ... 分析逻辑 } // 记得恢复默认错误处理 errorProc(defaultErrorProc) - 注意:这个方法依赖错误提示文本的匹配,如果你的DOORS是英文版本,要把判断里的中文换成对应的英文提示,比如
"invalid filter"、"enum type does not exist"。
额外提醒
- 先拿几个小模块测试逻辑,没问题再批量跑,避免出问题。
- 如果筛选器逻辑复杂(比如嵌套条件、多个枚举引用),要优化正则表达式或者解析逻辑,确保不漏判也不误判。
内容的提问来源于stack exchange,提问作者racketteer
相关产品推荐
相关产品推荐

