Error handling 如何在系统间Caché;中使用$etrap真正捕获所有错误;?
因为这个,我一直在磕头。按照$etrap(错误处理特殊变量)的构思,您必须小心地真正捕获所有错误。我在这方面取得了部分成功。但我仍然缺少一些东西,因为在用户模式(应用程序模式)下运行时,仍有内部缓存库错误导致应用程序停止 我所做的是:Error handling 如何在系统间Caché;中使用$etrap真正捕获所有错误;?,error-handling,intersystems-cache,Error Handling,Intersystems Cache,因为这个,我一直在磕头。按照$etrap(错误处理特殊变量)的构思,您必须小心地真正捕获所有错误。我在这方面取得了部分成功。但我仍然缺少一些东西,因为在用户模式(应用程序模式)下运行时,仍有内部缓存库错误导致应用程序停止 我所做的是: ProcessX(var) set sc=$$ProcessXProtected(var) w !,"after routine call" quit sc ProcessXProtected(var) new $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
在所有这些之后,我可以看到,当我从提示符调用程序时,它工作了!但是,当我从缓存终端脚本(应用程序模式,我被告知)调用时,它失败并中止程序(错误捕获机制不按预期工作)。是否可能只在用户模式下设置了旧式错误捕获($ZTRAP) 关于这方面的文档非常好,所以我不在这里重复,但关键点是$ZTRAP与$ETRAP的编写方式不同。在某种程度上,它是“隐式的newed”,因为它的值仅适用于当前堆栈级别和后续调用。一旦退出超过设置的级别,它将恢复为以前的任何值 另外,我不确定$ETRAP和$ZTRAP处理程序之间是否有定义的优先顺序,但如果$ZTRAP具有更高的优先级,则会覆盖$ETRAP 在调用库函数之前,您可以尝试自己设置$ZTRAP。将其设置为与$ETRAP不同的值,以便可以确定触发了哪一个 尽管如此,这可能也无济于事。如果在库函数中设置$ZTRAP,则新值将生效,因此这不会产生任何影响。只有当$ZTRAP的值来自堆栈的更高层时,这才有助于您
你没有提到是什么库函数导致了这一点。我的公司有一些库函数的源代码,所以如果你能告诉我函数名,我会看看我能找到什么。请也给我$ZVersion的值,这样我可以确定我们讨论的是同一版本的缓存。是否可能只有在用户模式下才设置了旧式错误陷阱($ZTRAP) 关于这方面的文档非常好,所以我不在这里重复,但关键点是$ZTRAP与$ETRAP的编写方式不同。在某种程度上,它是“隐式的newed”,因为它的值仅适用于当前堆栈级别和后续调用。一旦退出超过设置的级别,它将恢复为以前的任何值 另外,我不确定$ETRAP和$ZTRAP处理程序之间是否有定义的优先顺序,但如果$ZTRAP具有更高的优先级,则会覆盖$ETRAP 在调用库函数之前,您可以尝试自己设置$ZTRAP。将其设置为与$ETRAP不同的值,以便可以确定触发了哪一个 尽管如此,这可能也无济于事。如果在库函数中设置$ZTRAP,则新值将生效,因此这不会产生任何影响。只有当$ZTRAP的值来自堆栈的更高层时,这才有助于您 你没有提到是什么库函数导致了这一点。我的公司有一些库函数的源代码,所以如果你能告诉我函数名,我会看看我能找到什么。请也给我$ZVersion的值,这样我可以确定我们谈论的是相同版本的缓存