ExceptionList 树具有自己的相关名 ExceptionList,您必须在引用或设置此树内容的所有 ESQL 语句中使用此相关名。
此树在解析输入消息时使用逻辑树创建。它开始时是空的,且仅在消息流处理期间发生异常时填充。可能发生多个异常;如果发生这种情况,则 ExceptionList 树包含每个异常的子树。
您可以访问 Compute、Database 和 Filter 节点中的 ExceptionList 树,而且可以在 Compute 节点中更新它。必须使用相应的相关名;对 Database 或 Filter 节点使用 Exception List,对 Compute 节点使用 InputExceptionList。
您可能要在错误处理过程中在节点中访问此树。例如,您可能要基于异常类型将消息路由到不同路径,如使用 ESQL THROW 语句明确生成的异常,或代理生成的异常。
以下 ESQL 显示了如何访问 ExceptionList 并处理它包含的每个子代:
-- Declare a reference for the ExceptionList -- (in a Compute node use InputExceptionList) DECLARE start REFERENCE TO ExceptionList.*[1]; -- Loop through the exception list children WHILE start.Number IS NOT NULL DO -- more ESQL -- Move start to the last child of the field to which it currently points MOVE start LASTCHILD; END WHILE;
下面第二个示例显示了 ESQL 的摘要,该 ESQL 编码用于 Compute 节点从异常列表循环至最后一个(嵌套的)异常描述,并抽取错误号。此错误与问题的最初原因有关,通常提供最准确的信息。消息流执行的后续操作可以由用此方法检索的错误号确定。
CREATE PROCEDURE getLastExceptionDetail(IN InputTree reference,OUT messageNumber integer, OUT messageText char) /**************************************************************************** * A procedure that will get the details of the last exception from a message * IN InputTree: The incoming exception list * IN messageNumber: The last message numberr. * IN messageText: The last message text. *****************************************************************************/ BEGIN -- Create a reference to the first child of the exception list declare ptrException reference to InputTree.*[1]; -- keep looping while the moves to the child of exception list work WHILE lastmove(ptrException) DO -- store the current values for the error number and text IF ptrException.Number is not null THEN SET messageNumber = ptrException.Number; SET messageText = ptrException.Text; END IF; -- now move to the last child which should be the next exceptionlist move ptrException lastchild; END WHILE; END;
有关使用 ExceptionList 的更多信息,请参阅错误处理程序样本中的子流,该样本包含查询 ExceptionList 结构并根据它的内容采取特定操作的 ESQL。