许多缓存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不为您提供异常对象,您将只看到您有一个
这是两种不同的错误机制,不能以这种方式组合。ztrap和%ETN用于缓存级错误(尖括号错误,如<UNDEFINED>
)。%Status对象用于应用程序级别的错误(包括通过使用缓存类库发生的错误),您可以选择自己想要如何处理它们。通过缓存错误机制处理坏的%Status实际上没有意义,因为没有发生缓存错误。
一般来说,大多数人做的事情类似于:
d: $ $ $ ISERR(地位)$ $ $ SomeMacroRelevantToMyAppThatWillHandleThisStatus(地位)
可以为您的应用程序创建您自己的域,其中包含您自己的全部%Status代码和相应的%msg值。你的应用程序可能已经尝试连接到FTP服务器,并有一个坏的密码,但这不会抛出一个<DISCONNECT>
,也没有理由调查堆栈,只是一个应用程序级别的错误,需要处理,可能要求用户输入一个新的密码。