政策錯誤須知

您正在查看 Apigee Edge 說明文件。
前往 Apigee X 說明文件
info

本主題將說明政策錯誤的結構,以及發生政策錯誤時設定的流程變數類型。如果您要為 Proxy 設計及實作錯誤處理,這項資訊就非常重要。

本主題假設您已大致瞭解 Edge 中錯誤處理功能的運作方式,而且您知道什麼是錯誤規則。如需審查,請參閱「處理錯誤」一文。本文中的資訊也可協助您瀏覽及使用政策錯誤參考資料

關於預設政策錯誤回應

當政策擲回錯誤時,Edge 會立即進入錯誤流程並產生錯誤訊息。系統產生的訊息是 JSON 物件,其中包含兩個位元組資訊:errorcodefaultstring

例如:

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

讓我們快速解析這則錯誤訊息:

errorcode 包含前置字元錯誤名稱,如下所示:[prefix].[error_name]。在上述範例中,「steps.extractvariables」是前置字串,SourceMessageNotAvailable 則是錯誤名稱。前置字串會指出產生錯誤的政策類型。在上述範例中,您可以得知擷取變數政策產生錯誤,且錯誤名稱為 SourceMessageNotAvailable

faultstring 包含錯誤的說明。錯誤字串通常會提供線索,協助您找出導致錯誤的特定問題,例如政策名稱、未解析變數的名稱,或導致錯誤的任何因素。例如,在上述錯誤訊息中,「foo」是政策中參照的未解析訊息變數名稱,「ParseJsonResponse」則是觸發錯誤的政策名稱。

政策錯誤專屬變數

當系統觸發政策錯誤時,會填入特定錯誤專屬流程變數。這些變數在錯誤處理時非常實用。如處理錯誤主題所述,常見的做法是捕捉系統產生的政策錯誤,並執行後續動作,例如建立自訂錯誤回應。例如,基於安全理由,您可能希望防止用戶端看見 Edge 傳回的實際錯誤和狀態碼。

fault.name 變數

如果政策擲回錯誤,會把資料流變數 fault.name 設為錯誤代碼的 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 變數僅適用於 Proxy 的錯誤流程。您可以透過錯誤變數取得實用資訊,例如錯誤訊息、狀態碼、原因詞組等。錯誤變數的格式模式如下:

error.[error_component] = [value]

例如:

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



error.status.code = "500"

message 變數也適用於錯誤流程,且可用於與 error 變數類似的用途。訊息變數很特別,因為其具備脈絡。它在要求流程中的運作方式類似要求變數,在回應流程中,則可以用來取得/設定回應值。詳情請參閱「訊息變數的用途」。

如要瞭解所有 Edge 變數 (包括 errormessage) 的相關資訊,請參閱「變數參考資料」。