如何将 %状态"throw"为 %ETN?



许多缓存API方法返回一个%Status对象,该对象表示这是否是一个错误。问题是,当它是一个未知的错误,我不知道如何处理(如网络故障),我真正想做的是"抛出"错误,所以我的代码停止它正在做的事情,错误被一些更高级别的错误处理程序(和/或内置的%ETN错误日志)捕获。

我可以使用ztrap:

s status = someObject.someMethod()
ztrap:$$$ISERR(status)

但是这并没有报告太多的细节(不像。net,我可以抛出一个异常一直到堆栈的顶部),我想知道是否有更好的方法来做到这一点。

查看%Exception.StatusException的类参考。您可以从您的状态创建一个异常,并将其抛出到当时活动的任何错误陷阱(因此控制流将与您的ZTRAP示例相同),如下所示

set sc = someobj.MethodReturningStatus()
if $$$ISERR(sc) {
   set exception = ##class(%Exception.StatusException).CreateFromStatus(sc)
   throw exception
}

但是,为了恢复捕获此异常的错误陷阱代码中的异常信息,必须使用try/catch建立错误陷阱。旧的错误处理程序$ztrap和$etrap不为您提供异常对象,您将只看到您有一个错误作为$ZERROR值。即使在这种情况下,控制流也会按照您的要求工作,但是如果没有try/catch,您将不会比使用ZTRAP

更好。

这是两种不同的错误机制,不能以这种方式组合。ztrap和%ETN用于缓存级错误(尖括号错误,如<UNDEFINED>)。%Status对象用于应用程序级别的错误(包括通过使用缓存类库发生的错误),您可以选择自己想要如何处理它们。通过缓存错误机制处理坏的%Status实际上没有意义,因为没有发生缓存错误。

一般来说,大多数人做的事情类似于:

d: $ $ $ ISERR(地位)$ $ $ SomeMacroRelevantToMyAppThatWillHandleThisStatus(地位)

可以为您的应用程序创建您自己的域,其中包含您自己的全部%Status代码和相应的%msg值。你的应用程序可能已经尝试连接到FTP服务器,并有一个坏的密码,但这不会抛出一个<DISCONNECT>,也没有理由调查堆栈,只是一个应用程序级别的错误,需要处理,可能要求用户输入一个新的密码。

这可能看起来很奇怪,有这两种并行的错误机制,但它们描述的是两种不同类型的错误。其中一个是"平台"级错误,另一个是"应用程序级错误" 编辑:我忘记了一件事,尝试DecomposeStatus^%apiOBJ(status)或##class(% status) . logicaltoodbc (status)将状态对象转换为人类可读的字符串。此外,如果您正在执行命令行调试或只想将可读形式打印到主设备,则可以使用$system.OBJ.DisplayError(status)。

相关内容

  • 没有找到相关文章

最新更新