2016-12-07 38 views
0

我正在努力將UI觸發器中的系統錯誤對象傳播到主程序。從OpenEdge UI觸發器向主程序拋出錯誤

ON CHOOSE OF btnButton IN FRAME frmFrame 
    DO: 

    /* this will cause a system error */ 
    FIND FIRST Customer NO-LOCK 
      WHERE Customer.CustNum = 1875918759178. 

    CATCH eErr AS Progress.Lang.SysError: 
     /* It does get caught over here */ 
     UNDO, THROW eErr. 
    END CATCH. 
    END. 

    CATCH eMain AS Progress.Lang.SysError: 
    /* this message doesn't happen */ 
    MESSAGE 
     "caught" 
     VIEW-AS ALERT-BOX. 
    END CATCH. 

雖然它似乎不想傳播錯誤對象。有任何想法嗎?

回答

1

從上THROW選項的文件,撤消聲明:

「UNDO,扔是不允許的CATCH塊用戶界面觸發器ABL不會將用戶界面觸發器提升或返回錯誤,這樣做會導致編譯時錯誤。「 上面的句子說」你不是......「我相信它應該是「不允許你」。但是文檔本身是錯誤的。

無論如何,看起來你正在努力實現的目前尚不可能(截至2016年12月27日)。

+0

謝謝。我敢肯定,我可以想出一些彌補它的東西。 – Ivan

0

嘗試使用上的查找語句的結束NO-ERROR:

FIND FIRST Customer NO-LOCK 
     WHERE Customer.CustNum = 1875918759178 NO-ERROR. 

然後你可以使用錯誤狀態系統處理捕獲錯誤:

MESSAGE ERROR-STATUS:ERROR SKIP 
     ERROR-STATUS:GET-MESSAGE(1) 
     VIEW-AS ALERT-BOX. 

該錯誤狀態應該被設置,直到其他語句執行NO-ERROR。您也可以利用現有的(客戶),看看是否記錄發現:

MESSAGE AVAILABLE(Customer) VIEW-AS ALERT-BOX. 
+0

謝謝。通常我會使用帶有NO-ERROR選項的FIND語句。然後使用ERROR-STATUS:ERROR或AVAILABLE()進行測試。在這種特殊情況下,我強制要求測試程序如何處理系統錯誤的情況。它將錯誤對象從UI觸發器傳遞到包含過程 – Ivan

+0

將觸發器代碼移動到過程可能會更好。如果發生錯誤,您可以將其作爲參數傳遞給觸發器,避免在觸發器中使用'UNDO,THROW'的問題。 – TheDrooper