有关政策错误的注意事项

本主题介绍政策错误的结构以及发生政策错误时设置的流变量种类。如果您要为代理设计和实现故障处理,此信息非常重要。

本主题假设您大致了解 Google Cloud Apigee 中的故障处理机制,并了解什么是故障规则。如果您需要进行回顾,请参阅处理故障。此处的信息还可帮助您导航和使用政策参考

默认政策错误响应简介

当政策抛出错误时,Apigee 会立即进入错误流并生成错误消息。该系统生成的消息是一个 JSON 对象,它包含 errorcodefaultstring 这两种信息。

例如:

{
   "fault":{
      "detail":{
         "errorcode":"steps.extractvariables.SourceMessageNotAvailable"
      },
      "faultstring":"mymessage message is not available for ExtractVariable: ParseJsonResponse"
   }
}

让我们快速解构此错误消息:

errorcodeprefixerror name 组成,如下所示:[prefix].[error_name]。在上面的示例中,steps.extractvariables 是前缀,SourceMessageNotAvailable 是错误名称。前缀可让您了解生成错误的政策的种类。在上面的示例中,您可以看到 ExtractVariables 政策生成了错误,错误名称为 SourceMessageNotAvailable

faultstring 包含错误描述。故障字符串通常包含线索,可帮助您找到导致错误的具体问题,例如政策名称、未解析变量的名称或导致错误的任何原因。例如,在上述错误消息中,mymessage 是政策中引用的未解析消息变量的名称,ParseJsonResponse 是触发错误的政策的名称。

政策错误特有的变量

当触发政策错误时,某些特定于错误的流变量将被填充。这些变量在故障处理中非常有用。如处理故障主题中所述,捕获系统生成的政策错误并执行后续操作(例如创建自定义错误响应)是一种常见的做法。例如,出于安全原因,您可能需要禁止客户端查看 Apigee 返回的实际错误和状态代码。

fault.name 变量

当政策抛出错误时,它会将流变量 fault.name 设置为 errorcode 的 error_name 部分(如上一部分中所述)。在有条件执行故障规则时,通常要评估此变量。

下面是一个示例故障规则,用于测试 fault.name 的值:

<faultrule name="VariableOfNonMsgType"<>/faultrule><FaultRule name="Source Message Not Available Fault">
    <Step>
        <Name>AM-CustomErrorMessage</Name>
        <Condition>(fault.name Matches "SourceMessageNotAvailable") </Condition>
    </Step>
</FaultRule>

请记住,当政策触发错误时,fault.name 变量始终设置为错误名称。

[prefix].[policy_name].failed 变量

fault.name 外,开发者通常检查的另一个变量是 [prefix].[policy_name].failed 标志,该标志会在执行政策时设为 true 或 false。在故障规则中,您需要检查其何时为 true,也就是检查是否出现了错误。以下代码显示如何构建条件来检查 [prefix].[policy_name].failed 标志。如需正确检查此变量,您需要了解以下两点:

  • 您正在检查的政策的名称。这是政策的名称特性的值,而不是显示名。该特性始终包含在政策定义的 XML 中。
  • 特定于您正在检查的政策类型的前缀。(我们将在下文中说明如何查找前缀。)

为便于说明,我们来看另一个故障规则示例。请注意在外部条件中 [prefix].[policy_name].failed 变量名称是如何形成的。在本例中,前缀为 extractvariables,政策名称为 ParseJsonResponse。在这种情况下,只有在此变量为 true 时,故障规则才会执行。这有一个诀窍,由于错误规则可能包含多个步骤,因此这种模式非常适合将错误规则整理成块。

<faultrule name="VariableOfNonMsgType"></faultrule><FaultRule name="Extract Variable Faults">
    <Step>
        <Name>AM-CustomErrorMessage</Name>
        <Condition>(fault.name Matches "SourceMessageNotAvailable") </Condition>
    </Step>
    <Condition>(extractvariables.ParseJsonResponse.failed = true) </Condition>
</FaultRule>

errormessage 变量简介

error 变量仅在代理的错误流中可用。您可以从 error 变量中获取有用的信息,例如错误消息、状态代码、原因短语等。错误变量的格式模式如下:

error.ERROR_COMPONENT = VALUE

例如:

error.message = "request message is not available for ExtractVariable:
  ParseJsonResponse"

error.status.code = "500"

message 变量在错误流中也可用,并且可以用于与 error 变量类似的用途。消息变量比较特殊,因为它是上下文相关的。在请求流中,它的行为类似于请求变量,而在响应流程中它可用于获取/设置响应值。

如需了解所有 Apigee 变量(包括 errormessage),请参阅流变量参考