从OpenEdge UI触发器向主程序抛出错误

问题描述:

我正在努力将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. 

虽然它似乎不想传播错误对象。有任何想法吗?

从上THROW选项的文件,撤消声明:

“UNDO,扔是不允许的CATCH块用户界面触发器ABL不会将用户界面触发器提升或返回错误,这样做会导致编译时错误。“ 上面的句子说”你不是......“我相信它应该是“不允许你”。但是文档本身是错误的。

无论如何,看起来你正在努力实现的目前尚不可能(截至2016年12月27日)。

+0

谢谢。我敢肯定,我可以想出一些弥补它的东西。 – Ivan

尝试使用上的查找语句的结束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