MuleSoft - Mule 错误处理
新的 Mule 错误处理是 Mule 4 中最大的变化之一。新的错误处理可能看起来很复杂,但它更好、更高效。在本章中,我们将讨论 Mule 错误的组成部分、错误类型、Mule 错误的类别以及处理 Mule 错误的组件。
Mule 错误的组成部分
Mule 错误是 Mule 异常失败的结果,具有以下组成部分 −
描述
它是 Mule 错误的重要组成部分,它将提供有关问题的描述。其表达式如下 −
#[error.description]
类型
Mule 错误的类型组件用于描述问题。它还允许在错误处理程序中进行路由。其表达式如下 −
#[error.errorType]
Cause
Mule error 的 Cause 组件给出了导致失败的底层 java throwable。其表达式如下 −
#[error.cause]
Message
Mule error 的 Message 组件显示有关错误的可选消息。其表达式如下 −
#[error.errorMessage]
Child Errors
Mule error 的 Child Errors 组件提供了一个可选的内部错误集合。这些内部错误主要由 Scatter-Gather 等元素使用,以提供聚合路由错误。其表达式如下 −
#[error.childErrors]
示例
如果 HTTP 请求失败,状态代码为 401,则 Mule 错误如下 −
Description: HTTP GET on resource ‘http://localhost:8181/TestApp’ failed: unauthorized (401) Type: HTTP:UNAUTHORIZED Cause: a ResponseValidatorTypedException instance Error Message: { "message" : "Could not authorize the user." }
Sr.NO | 错误类型和说明 |
---|---|
1 | TRANSFORMATION 此错误类型表示转换值时发生错误。该转换是 Mule Runtime 内部转换,而不是 DataWeave 转换。 |
2 | EXPRESSION 这种错误类型表示在评估表达式时发生错误。 |
3 | VALIDATION 这种错误类型表示发生了验证错误。 |
4 | DUPLICATE_MESSAGE 当消息被处理两次时发生的一种验证错误。 |
5 | REDELIVERY_EXHAUSTED 当用尽了重新处理来自源的消息的最大尝试次数时,会发生这种错误类型。 |
6 | CONNECTIVITY 此错误类型表示建立连接时出现问题。 |
7 | ROUTING 此错误类型表示路由消息时发生错误。 |
8 | SECURITY 此错误类型表示发生了安全错误。例如,收到无效凭据。 |
9 | STREAM_MAXIMUM_SIZE_EXCEEDED 当流允许的最大大小用尽时,会发生此错误类型。 |
10 | TIMEOUT 表示处理消息时超时。 |
11 | UNKNOWN 此错误类型表示发生了意外错误。 |
12 | SOURCE 表示流程源中发生错误。 |
13 | SOURCE_RESPONSE 表示在处理成功响应时流程源中发生错误。 |
在上面的例子中,你可以看到 mule 错误的 message 组件。
错误类型
让我们借助错误类型的特点 − 来理解它
Mule 错误类型的第一个特点是它由 命名空间和标识符 组成。这使我们能够根据其领域区分类型。在上面的例子中,错误类型是 HTTP: UNAUTHORIZED。
第二个重要的特点是错误类型可能有一个父类型。例如,错误类型 HTTP: UNAUTHORIZED 的父类型是 MULE:CLIENT_SECURITY,而后者又有一个名为 MULE:SECURITY 的父类型。此特性将错误类型确立为更全局项的规范。
错误类型的种类
以下是所有错误都属于的类别 −
ANY
此类别下的错误是流程中可能发生的错误。它们不太严重,可以轻松处理。
CRITICAL
此类别下的错误是无法处理的严重错误。以下是此类别下的错误类型列表 −
Sr.NO | 错误类型和描述 |
---|---|
1 | OVERLOAD 此错误类型表示由于过载问题而发生错误。在这种情况下,执行将被拒绝。 |
2 | FATAL_JVM_ERROR 此类错误类型表示发生致命错误。例如,stack overflow。 |
自定义错误类型
自定义错误类型是我们定义的错误。它们可以在映射或引发错误时定义。我们必须为这些错误类型提供一个特定的自定义命名空间,以将它们与 Mule 应用程序中其他现有的错误类型区分开来。例如,在使用 HTTP 的 Mule 应用程序中,我们不能使用 HTTP 作为自定义错误类型。
Mule 错误的类别
从广义上讲,Mule 中的错误可以分为两类,即消息错误和系统错误。
消息错误
此类别的 Mule 错误与 Mule 流程有关。每当 Mule 流程中出现问题时,Mule 都会抛出消息错误。我们可以在错误处理程序组件中设置 On Error 组件来处理这些 Mule 错误。
系统错误
系统错误表示在系统级别发生的异常。如果没有 Mule 事件,则系统错误由系统错误处理程序处理。以下类型的异常由系统错误处理程序处理 −
- 应用程序启动期间发生的异常。
- 与外部系统的连接失败时发生的异常。
如果发生系统错误,Mule 会向已注册的侦听器发送错误通知。它还会记录错误。另一方面,如果错误是由连接失败引起的,Mule 会执行重新连接策略。
处理 Mule 错误
Mule 有以下两个错误处理程序来处理错误 −
On-Error 错误处理程序
第一个 Mule 错误处理程序是 On-Error 组件,它定义了它们可以处理的错误类型。如前所述,我们可以在类似作用域的错误处理程序组件内配置 On-Error 组件。每个 Mule 流仅包含一个错误处理程序,但此错误处理程序可以根据需要包含任意数量的 On-Error 作用域。借助 On-Error 组件,在流程内部处理 Mule 错误的步骤如下 −
首先,每当 Mule 流程引发错误时,正常流程执行就会停止。
接下来,流程将转移到已经具有 On Error 组件 的 Error Handler 组件,以匹配错误类型和表达式。
最后,Error Handler 组件将错误路由到与错误匹配的第一个 On Error 作用域。

以下是 Mule 支持的两种类型的 On-Error 组件 −
On-Error传播
On-Error Propagate 组件执行,但会将错误传播到下一级别并中断所有者的执行。如果事务由 On Error Propagate 组件处理,则将回滚事务。
On-Error Continue
与 On-Error Propagate 组件一样,On-Error Continue 组件也会执行事务。唯一的条件是,如果所有者已成功完成执行,则此组件将使用执行结果作为其所有者的结果。如果事务由 On-Error Continue 组件处理,则将提交事务。
Try Scope 组件
Try Scope 是 Mule 4 中提供的众多新功能之一。它的工作原理类似于 JAVA 的 try 块,我们过去常常将可能出现异常的代码封装在其中,这样就可以在不破坏整个代码的情况下进行处理。
我们可以在 Try Scope 中包装一个或多个 Mule 事件处理器,然后,try scope 将捕获并处理这些事件处理器抛出的任何异常。try scope 的主要工作围绕其自身的错误处理策略,该策略支持其内部组件而不是整个流程的错误处理。这就是为什么我们不需要将流程提取到单独的流程中。
示例
以下是使用 try 范围的示例 −

配置 try 范围以处理事务
众所周知,事务是一系列永远不应部分执行的操作。事务范围内的所有操作都在同一线程中执行,如果发生错误,则应导致回滚或提交。我们可以按照以下方式配置 try 范围,以便它将子操作视为事务。

INDIFFERENT [Default] − 如果我们在 try 块上选择此配置,则子操作将不会被视为事务。 在这种情况下,错误既不会导致回滚也不会导致提交。
ALWAYS_BEGIN − 它表示每次执行范围时都会启动一个新事务。
BEGIN_OR_JOIN − 它表示如果流的当前处理已经开始了一个事务,则加入它。 否则,开始一个新的。