政策錯誤須知

本頁內容適用於 ApigeeApigee Hybrid

查看 Apigee Edge 說明文件。

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

本主題假設您大致瞭解 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 設為錯誤碼的 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.ERROR_COMPONENT = VALUE

例如:

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

error.status.code = "500"

錯誤流程中也提供 message 變數,用途與 error 變數類似。訊息變數很特別,因為它是脈絡相關的。在要求流程中,這個變數的行為與要求變數類似;在回應流程中,這個變數可用於取得/設定回應值。

如要瞭解所有 Apigee 變數 (包括 errormessage),請參閱流程變數參考資料