处理流程中的错误

在作为流程的一部分对错误处理建模时,您可以使用错误中间事件或事件子流程捕获错误,并可使用错误结束事件抛出错误。
表 1. 错误事件在流程中的使用
事件 描述
活动边界处的错误中间事件 icon(错误边界事件)
  • 捕获指定错误或所有错误
  • 为其所连接活动引发的错误提供错误处理逻辑
以错误开始事件 icon 开始的错误事件子流程
  • 捕获指定错误或所有错误
  • 为流程、子流程或直接包含错误事件子流程的事件子流程引发的错误提供错误处理逻辑
错误结束事件 icon 抛出错误

使用错误中间事件捕获错误

对于流程,您可以将错误中间事件连接到活动,并将该事件连接到错误处理流或活动。 所连接的错误事件称为错误边界事件。

要确定是否使用错误中间事件,请考虑以下几点:

  • 如果在流程运行边界处带有连接的错误事件的活动时发生错误,该流程将沿与错误事件连接的序列行流动。 将在流中处理错误,然后继续正常处理。
  • 错误中间事件必须连接到活动。
  • 一个活动可以有多个错误事件,但是只有一个捕获错误。
  • 考虑指定错误数据以捕获特定错误,基于错误代码过滤捕获到的错误类型,并在捕获错误后将错误代码映射到变量。 捕获到所有错误后,或如果仅指定了错误代码,错误数据将捕获到 tw.system.step.error 变量中的 XMLElement
  • 要处理共享业务对象的保存服务中的验证错误,可捕获特定错误列表中提供的错误 BPMBOSaveFailedError。 此错误仅在自动(例如 Coach)或通过启用保存执行上下文选项显式保存执行上下文的节点上可用。 有关更多信息,请参阅 保存共享业务对象的服务

使用错误事件子流程捕获错误

事件子流程是一种专门化类型的子流程,它不是其父流程的正常序列流的一部分。 错误事件子流程是包含错误开始事件的事件子流程。 事件子流程不是由序列流连接的,仅在触发了事件子流程中的开始事件后运行。 您可以使用错误事件子流程处理流程中的错误。

要确定是否使用错误事件子流程,请考虑以下几点:
  • 通过在事件子流程中定位错误事件(而不是在该流程中定义错误事件)来定义可读流程。
  • 要对流程中的多个任务复用错误处理流,请使用事件子流程。 要使用连接的事件复用错误处理流,必须为每个任务连接中间事件,然后将这些事件连接到错误处理流。
  • 定义只能从事件子流程内部访问的数据对象。 只能定义属于子流程的数据对象。 父流程中不混杂不必要的变量。

有关事件子流程的更多信息,请参阅 对事件子流程建模

在流程级别进行异常处理的示例

您可以使用只读系统变量 tw.system.step.error 来访问存储的有关进程中发生的异常的信息。

此变量存在于某个步骤的作用域内(而非流程内)。 无法在下一个步骤检索此变量。 而改为必须在边界中间异常事件的后置分配部分中访问此变量。

下图中显示了如何对异常建模以及如何处理异常的示例:

此图显示如何在流程图中对异常进行建模。

要检索异常数据,请完成以下步骤:
  1. 声明类型为 XMLElement 的私有变量,例如,tw.local.error。 为其分配一个值,例如,新的 tw.object.XMLElement("abc")
  2. 为附加的中间异常事件创建后置分配,并将系统变量分配至步骤 1 中创建的变量,例如,tw.local.error = tw.system.step.error

    您可以在流程的后续步骤中的局部变量中使用此值。

抛出错误

您可以在流程中使用错误结束事件来指定错误代码,并在从流程或服务流抛出错误时映射到错误类型。

在使用错误事件或事件子流程时,考虑是否可以立即处理错误,正常的处理是否可以继续,或者是否可以在另一级别抛出另一错误。 然后自底向上实现错误处理。 在其他情况中,如果可以复用子流程,应该可以提高效率和可读性。 构建每个链接的流程和服务,以便可以捕获和纠正错误。 如果无法在实现的最低级别上进行纠正,可以通过不包含错误事件以便允许错误上移一个级别,或包含错误事件以向调用服务或流程重新抛出错误,如以下部分中所示。

例如,为确保捕获流程运行时可能发生的任何错误,您可以创建一个高级流程,使其中包含一个调用主流程作为链接流程的活动,以及一个带有用于实现错误处理的底层服务的额外活动,如下图所示:

此截屏显示上一段中描述的流程的图。

此类型的设计可以确保从底层流程和服务抛出的错误可以向上传播并得到适当处理。