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

时间:2016-12-07 14:39:19

标签: triggers progress-4gl openedge throw

我正在努力将系统错误对象从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.

它似乎并不想传播错误对象。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

从THROW选项的文档中,撤消声明:

“UNDO,THROW不允许在用户界面触发器的CATCH块中.ABL不会从用户界面触发器中引发或返回错误。这样做会导致编译时错误。” 上面的句子说“你不......”我认为它应该是“不允许你”。但文档本身是错误的。

无论如何,从今天(2016年12月27日)开始,你想要完成的事情似乎还不可能。

答案 1 :(得分:0)

尝试在FIND语句的末尾使用NO-ERROR:

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

然后您可以使用ERROR-STATUS系统句柄来捕获错误:

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

应该设置该错误状态,直到使用NO-ERROR执行其他语句。您还可以使用AVAILABLE(客户)查看是否找到了记录:

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