异常之后的消息树内容

如果有异常发生,将更新消息树内容。

如果处理消息期间未发生异常,那么单个消息流节点所接收到的树结构和内容将由流中先前节点的操作确定。 如果在消息流中发生异常,这四个树的内容将取决于以下几个因素:

  • 如果异常返回至输入节点,并且未连接输入节点 Catch 终端,这些树将被废弃。 如果消息在事务之中,将被返回至输入队列以进行进一步处理。 当再次处理消息时,将创建一个新的树结构。 如果消息不在事务中,将被废弃。
  • 如果异常返回到输入节点并且连接了 Catch 终端,那么将恢复最初由输入节点创建并通过 Out 终端传播的消息和局部环境树,并且对于跟在输入节点之后的节点中的内容生成的任何更新将丢失。 不恢复环境树,而会保留其内容。 如果输入节点之后的节点包含创建新的本地环境或消息树的 Compute 节点,那么这些树将丢失。 异常列表树反映已记录的一个或多个异常。
  • 如果 TryCatch 节点在消息流中捕获到异常,那么先前通过 TryCatch 节点的 "尝试" 终端传播的消息和本地环境树将通过 Catch 终端复原和传播。 您在 TryCatch 节点之后的节点中对其内容进行的任何更新都将丢失。 不恢复环境树,而会保留其内容。 如果 TryCatch 节点之后的节点包含用于创建新的本地环境或消息树的 Compute 节点,那么这些树将丢失。 异常列表树反映已记录的一个或多个异常。

消息流中的异常处理路径

异常处理路径从故障终端 (大多数消息处理节点都有这些) ,输入节点的 Catch 终端, TryCatch 节点或 AggregateReply 节点开始,但原则上与正常消息流路径不同。 此类流由一系列消息流设计者连接在一起的节点组成。 异常处理路径在它们用于记录异常及对异常做出的反应的处理类型上存在不同。 例如,它们可能会检查异常列表以确定错误的性质,并采取相应的操作或记录来自消息或异常的数据。

传播到异常处理消息流路径的局部环境和消息树都是异常路径开始处的而不是抛出异常处的局部环境和消息树。 下图阐述此点:

此图显示了以下文本中描述的消息流的抽取
  • 消息 (M1) 和局部环境 (L1) 由消息流进行处理。 它们通过 TryCatch 节点传递到 Compute1。
  • Compute1 更新消息和局部环境,并将新消息 (M2) 和局部环境 (L2) 传播到下一个节点 Compute2。
  • 在 Compute2 中抛出一个异常。 如果未连接 Compute2 的 Failure 终端 (点 B) ,那么会将异常传播回 TryCatch 节点,但消息和本地环境并非如此。 在点 A 处开始的异常处理路径有权访问第一条消息和局部环境(M1 和 L1)。 环境树也是可用的,并且它会保留异常发生时它所具有的内容。
  • 如果连接了 Compute2 的 Failure 终端(点 B),消息和局部环境 M2 和 L2 将会被传播到与该 Failure 终端连接的节点。 环境树也是可用的,并且它会保留异常发生时它所具有的内容。