如何在IntersystemsCaché中使用$ etrap真正捕获所有错误?

时间:2008-10-13 20:34:48

标签: error-handling intersystems-cache

由于这个原因,我一直在敲打我的脑袋。在构思$ etrap(错误处理特殊变量)的方式中,你必须小心真正地捕获所有错误。我在这方面取得了部分成功。但我仍然遗漏了一些东西,因为当在用户模式(应用程序模式)下运行时,仍有内部缓存库错误仍在暂停应用程序。

我做的是:

ProcessX(var)

    set sc=$$ProcessXProtected(var)
    w !,"after routine call"
    quit sc

ProcessXProtected(var)

    new $etrap
    ;This stops Cache from processing the error before this context. Code
    ; will resume at the line [w !,"after routine call"] above
    set $etrap="set $ECODE = """" quit:$quit 0 quit"

    set sc=1 
    set sc=$$ProcessHelper(var)
    quit sc

ProcessHelper(var)

    new $etrap
    ; this code tells Cache to keep unwindind error handling context up
    ; to the previous error handling.
    set $etrap="quit:$quit 0 quit"

    do AnyStuff^Anyplace(var)

    quit 1

AnyStuffFoo(var)
    ; Call anything, which might in turn call many sub routines
    ; The important point is that we don't know how many contexts
    ; will be created from now on. So we must trap all errors, in any
    ; case.

    ;Call internal Cache library
    quit

毕竟,我可以看到,当我从提示中调用程序时,它可以工作!但是,当我从缓存终端脚本(应用程序模式,我被告知)调用它失败并中止该程序(错误陷阱机制不能按预期工作)。

1 个答案:

答案 0 :(得分:1)

是否可能仅在Usermode中设置旧式错误陷阱($ ZTRAP)?

关于这个的文档相当不错,所以我不会在这里重复所有内容,但关键的一点是$ ZTRAP不是New-ed,就像$ ETRAP一样。在某种程度上,它是“隐式new-ed”,因为它的值仅适用于当前堆栈级别和后续调用。一旦退出设置的级别,它将恢复到之前的任何值。

此外,我不确定$ ETRAP和$ ZTRAP处理程序之间是否存在已定义的优先顺序,但如果$ ZTRAP具有更高的优先级,则会覆盖您的$ ETRAP。

您可以在调用库函数之前尝试自己设置$ ZTRAP。将它设置为与$ ETRAP不同的东西,这样你就可以确定触发了哪一个。

尽管如此,这可能没什么帮助。如果在库函数中设置了$ ZTRAP,则新值将生效,因此这不会产生任何影响。如果$ ZTRAP的值来自堆栈的某个地方,这只会对你有帮助。

你没有提到库函数导致了什么。我的公司有一些库函数的源代码,所以如果你能告诉我函数名,我会看到我能找到的东西。请给我$ ZVersion的值,这样我就可以确定我们正在谈论相同版本的Cache。