从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日)。
尝试使用上的查找语句的结束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.
谢谢。通常我会使用带有NO-ERROR选项的FIND语句。然后使用ERROR-STATUS:ERROR或AVAILABLE()进行测试。在这种特殊情况下,我强制要求测试程序如何处理系统错误的情况。它将错误对象从UI触发器传递到包含过程 – Ivan
将触发器代码移动到过程可能会更好。如果发生错误,您可以将其作为参数传递给触发器,避免在触发器中使用'UNDO,THROW'的问题。 – TheDrooper
谢谢。我敢肯定,我可以想出一些弥补它的东西。 – Ivan