为什么 DXL 脚本可以在 DOORS 中运行但在 运行 批处理模式下却不能运行的一些常见原因是什么?

What are some common reasons for why a DXL script would work in DOORS but not when it's run in batch mode?

我有一个 dxl 脚本,它在 DOORS 应用程序中 运行 时有效,但在批处理模式下 运行 时无效。我不确定为什么会这样。 运行在批处理模式下出现以下错误:

doors:断言失败,第 3173 行,document.cpp:!nls_("unexpected: tree root does not have a name attribute") stack

我知道创建 GUI 和类似的东西可能会导致此错误,但我没有这样做。奇怪的是脚本在不同的模块和模块的不同部分停止 运行ning。因此,脚本每次 运行 都会在 DOORS 的不同区域出现故障。

以下是我认为可能导致批处理模式错误的相关代码:

Buffer bsz = create

void addNewLineSeparator(Buffer& b)
{
if (length(b) > 0)
{
    b += "\n"
}
}

void display(string s)
{
addNewLineSeparator(bsz)
    bsz += s
}

void displayRich(string s)
{
addNewLineSeparator(bsz)
    bsz += s
}

void displayRichWithColour(string s)
{
addNewLineSeparator(bsz)
    bsz += s
}

void displayRichWithColor(string s)
{
addNewLineSeparator(bsz)
    bsz += s
}

void display(Attr__ a)
{
string s = richText a
    if (!null s)
    {
        displayRich s
    }
}

string showOut(Object o, int depth) {
Link l
    LinkRef lr
    ModName_ otherMod = null
    Module linkMod = null
    ModuleVersion otherVersion = null
    Object othero
    string disp = null
    string s = null
    string plain, plainDisp
    int plainTextLen
    int count
    bool doneOne = false
    string linkModName = "*"
    for l in all(o->linkModName) do {
        otherVersion = targetVersion l
            otherMod = module(otherVersion)
            if (null otherMod || isDeleted otherMod) continue
                othero = target l
                if (null othero) {
                    load(otherVersion, false)
                }
        othero = target l
            if (null othero) continue
                if (isDeleted othero) continue
                    doneOne = true
                    if (depth == 1) {
                        s = fullName(otherMod)
                            if (isBaseline(otherVersion)) {
                                s = s " [" versionString(otherVersion) "]"
                            }
                        if (s == "")
                            displayRich("\pard " " ")
                        else
                            displayRich("\pard " s)
                    }
    }
return s
}
for o in m do
    {
        print showOut(o, 1)

}

任何可能依赖于视图的东西都可能发生这种情况。 DOORS 的批处理模式可能很挑剔。此外,DOORS 在内存管理方面并不十分谨慎——如果可以的话,将代码分成多个部分可能更有意义,其中一个部分运行一个轻量级集,该集在 'eval_' 函数内运行其他代码。这将有助于更顺畅地保持内存 de-allocation 运行(我曾使用此技巧对我们的数据库进行完整 link 清点 - 超过 16000 个模块打开和关闭!)

回复您的编辑:

您显示的代码是 Layout DXL,它在显示视图时进行评估 - 具体来说,'displayRich' 函数试图获取一个富文本字符串并将其放入适当的列 - 但该列不存在,因为视图上下文不是以批处理模式创建的。

一个简单的解决方法是将整个代码包装在:

if(!isBatch){
     // Your Code Here
}

这将确保仅当用户处于 non-batch 模式的 运行 DOORS 时才计算 DXL。