2011-10-06 35 views
2

許多CachéAPI方法返回一個%Status對象,指示這是否爲錯誤。事情是,當它是一個未知的錯誤,我不知道如何處理(如網絡故障),我真正想要做的是「拋出」錯誤,所以我的代碼停止它正在做的事情,錯誤被一些更高的級別的錯誤處理程序(和/或內置的%ETN錯誤日誌)。如何將%狀態「扔」到%ETN?

我可以用ztrap,如:

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

但是,不報告的細節(不像,說,.NET在那裏我可以拋出一個異常,一路到堆棧的頂部)和我想知道是否有更好的方法來做到這一點。

回答

1

這是兩種不同的錯誤機制,不能以這種方式組合。 ztrap和%ETN用於高速緩存級錯誤(尖括號錯誤,如<UNDEFINED>)。 %狀態對象用於應用程序級錯誤(包括通過使用緩存類庫發生的錯誤),您可以選擇自己想要如何處理它們。通過Cache錯誤機制來處理錯誤的%Status並沒有意義,因爲沒有發生Cache錯誤。

通常是大多數人做的是一個類似於:

d:$$$ ISERR(狀態)$$$ SomeMacroRelevantToMyAppThatWillHandleThisStatus(狀態)

它可以用自己的整個創建自己的域名%主機的%狀態代碼與您的應用程序的值班人員%味精值。您的應用程序可能嘗試連接到FTP服務器並輸入了錯誤的密碼,但這並不會導致<DISCONNECT>,也沒有理由調查堆棧,只需要處理一個應用程序級別的錯誤,可能通過詢問用戶輸入新密碼。

看起來很奇怪,有兩種並行的錯誤機制,但它們描述了兩種不同類型的錯誤。想一個是「平臺」級錯誤,另一個是「應用程序級錯誤」

編輯:我忘了一件事,嘗試DecomposeStatus ^%apiOBJ(status)或## class(%Status).LogicalToOdbc (狀態)將狀態對象轉換爲人類可讀的字符串。另外,如果您正在執行命令行調試,或者只是想將可讀格式打印到主體設備上,則可以使用$ system.OBJ.DisplayError(status)。

+0

我剛剛和一位朋友談過,這位朋友解釋說有一種方法可以做這個!他將很快發佈。 – mcbainpc

2

查看%Exception.StatusException的類參考。您可以從您的狀態創建一個例外,將其投入到任何錯誤陷阱是活動的時間(所以控制流將與您的ZTRAP例子),這樣

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

然而,爲了恢復捕獲此異常的錯誤陷阱代碼中的異常信息,必須使用try/catch建立錯誤陷阱。較早的錯誤處理程序$ ztrap和$ etrap不會爲您提供異常對象,並且只會看到$ ERROR值爲<NOCATCH>錯誤。即使在這種情況下,控制流程仍然可以按照您的要求工作,但是如果沒有嘗試/捕獲,您將不會比使用ZTRAP更好。

相關問題