จัดการข้อผิดพลาด

คู่มือนี้จะอธิบายวิธีจัดการข้อผิดพลาดที่เกิดขึ้นเมื่อขั้นตอนของโฟลว์ทำงาน คุณสามารถระบุได้ว่าขั้นตอนที่ล้มเหลวต้องให้ผู้ใช้ดำเนินการเพื่อแก้ไขหรือไม่ หรือจะลองอีกครั้งได้หรือไม่

  • แสดงข้อผิดพลาดที่ดำเนินการได้: เพิ่มปุ่มลงในบันทึกข้อผิดพลาดซึ่งจะนำผู้ใช้ไปยังการ์ดการกำหนดค่าของขั้นตอนดังกล่าว เพื่อให้ผู้ใช้แก้ไขข้อมูลที่ป้อนเพื่อแก้ไขข้อผิดพลาดได้ หากต้องการทําเครื่องหมายข้อผิดพลาดว่าดําเนินการได้ ให้ส่งกลับ AddOnsResponseService.ErrorActionability.ACTIONABLE หากต้องการทำเครื่องหมายข้อผิดพลาดว่าดำเนินการไม่ได้ ให้ส่งคืน AddOnsResponseService.ErrorActionability.NOT_ACTIONABLE
  • ลองขั้นตอนอีกครั้งหลังจากเกิดข้อผิดพลาด: โฟลว์จะพยายามเรียกใช้ขั้นตอนอีกครั้งสูงสุด 5 ครั้งก่อนที่จะหยุด หากต้องการทำเครื่องหมายข้อผิดพลาดว่าลองอีกครั้งได้ ให้ส่งคืน AddOnsResponseService.ErrorRetryability.RETRYABLE หากต้องการทำเครื่องหมายข้อผิดพลาดที่ลองอีกครั้งไม่ได้ ให้ส่งคืน AddOnsResponseService.ErrorRetryability.NOT_RETRYABLE

นอกจากนี้ คุณยังสร้างบันทึกข้อผิดพลาดที่กำหนดเองด้วยชิป ไฮเปอร์ลิงก์ และข้อความที่มีการจัดรูปแบบ เพื่อให้บริบทที่ละเอียดยิ่งขึ้นเกี่ยวกับข้อผิดพลาดแก่ผู้ใช้ได้ด้วย

แสดงข้อผิดพลาดที่นำไปใช้ได้จริง

ตัวอย่างต่อไปนี้สร้างขั้นตอนที่ขอให้ผู้ใช้ป้อนตัวเลขติดลบ หากผู้ใช้ป้อนตัวเลขที่เป็นบวก ขั้นตอนจะแสดงข้อผิดพลาดที่ดำเนินการได้ซึ่งแจ้งให้ผู้ใช้แก้ไขอินพุต

ไฟล์ Manifest ต่อไปนี้กําหนดอินพุต เอาต์พุต และฟังก์ชันของขั้นตอนที่จะเรียกใช้สําหรับการกําหนดค่าและการเรียกใช้

JSON

{
  "timeZone": "America/Toronto",
  "dependencies": {},
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "addOns": {
    "common": {
      "name": "Retry Errors Example",
      "logoUrl": "https://www.gstatic.com/images/icons/material/system/1x/pets_black_48dp.png",
      "useLocaleFromApp": true
    },
    "flows": {
      "workflowElements": [
        {
          "id": "returnElementError",
          "state": "ACTIVE",
          "name": "Return Element Error Action",
          "description": "To notify the user that some error has occurred",
          "workflowAction": {
            "inputs": [
              {
                "id": "value1",
                "description": "The input from the user",
                "cardinality": "SINGLE",
                "dataType": {
                  "basicType": "STRING"
                }
              }
            ],
            "outputs": [
              {
                "id": "output_1",
                "description": "The output",
                "cardinality": "SINGLE",
                "dataType": {
                  "basicType": "STRING"
                }
              }
            ],
            "onConfigFunction": "onConfiguration",
            "onExecuteFunction": "onExecution"
          }
        }
      ]
    }
  }
}

โค้ดต่อไปนี้สร้างการ์ดการกำหนดค่าและจัดการตรรกะการดำเนินการ รวมถึงการจัดการข้อผิดพลาด

Apps Script

/**
 * Returns a configuration card for the step.
 * This card contains a text input field for the user.
 */
function onConfiguration() {
  let section = CardService.newCardSection()
    .addWidget(CardService.newTextInput()
      .setFieldName("value1")
      .setId("value1")
      .setTitle("Please input negative numbers!"));
  const card = CardService.newCardBuilder().addSection(section).build();
  return card;
}

/**
 * Gets an integer value from variable data, handling both string and integer formats.
 * @param {Object} variableData The variable data object from the event.
 * @return {number} The extracted integer value.
 */
function getIntValue(variableData) {
  if (variableData.stringValues) {
    return parseInt(variableData.stringValues[0]);
  }
  return variableData.integerValues[0];
}

/**
 * Executes the step.
 * If the user input is a positive number, it throws an error and returns an
 * actionable error message. Otherwise, it returns the input as an output variable.
 * @param {Object} e The event object from the workflow.
 */
function onExecution(e) {
  try {
    var input_value = getIntValue(e.workflow.actionInvocation.inputs["value1"]);
    if (input_value > 0) {
      throw new Error('Found invalid positive input value!');
    }

    // If execution is successful, return the output variable and a log.
    const styledText_1 = AddOnsResponseService.newStyledText()
      .setText("Execution completed, the number you entered was: ")
      .addStyle(AddOnsResponseService.TextStyle.ITALIC)
      .addStyle(AddOnsResponseService.TextStyle.UNDERLINE);
    const styledText_2 = AddOnsResponseService.newStyledText().setText(input_value)
      .setFontWeight(AddOnsResponseService.FontWeight.BOLD);

    const workflowAction = AddOnsResponseService.newReturnOutputVariablesAction()
      .setVariables({
        "output_1": AddOnsResponseService.newVariableData().addStringValue(input_value)
      })
      .setLog(AddOnsResponseService.newWorkflowTextFormat()
        .addTextFormatElement(
          AddOnsResponseService.newTextFormatElement().setStyledText(styledText_1)
        ).addTextFormatElement(
          AddOnsResponseService.newTextFormatElement().setStyledText(styledText_2)
        ));

    let hostAppAction = AddOnsResponseService.newHostAppAction().setWorkflowAction(workflowAction);
    return AddOnsResponseService.newRenderActionBuilder().setHostAppAction(hostAppAction).build();

  } catch (err) {
    // If an error occurs, return an actionable error action.
    Logger.log('An error occurred: ' + err.message);

    const workflowAction = AddOnsResponseService.newReturnElementErrorAction()
      // Sets the user-facing error message.
      .setErrorLog(
        AddOnsResponseService.newWorkflowTextFormat()
        .addTextFormatElement(
          AddOnsResponseService.newTextFormatElement().setText("Failed because of invalid input values!"))
      )
      // Makes the error actionable, allowing the user to correct the input.
      .setErrorActionability(AddOnsResponseService.ErrorActionability.ACTIONABLE)
      // Specifies that the error is not automatically retried.
      .setErrorRetryability(AddOnsResponseService.ErrorRetryability.NOT_RETRYABLE);

    let hostAppAction = AddOnsResponseService.newHostAppAction().setWorkflowAction(workflowAction);
    return AddOnsResponseService.newRenderActionBuilder().setHostAppAction(hostAppAction).build();
  }
}

ลองทำขั้นตอนอีกครั้งหลังจากเกิดข้อผิดพลาด

ตัวอย่างต่อไปนี้สร้างขั้นตอนที่จำลองความล้มเหลวชั่วคราว หากเกิดข้อผิดพลาด ขั้นตอนจะแสดงข้อผิดพลาดที่ลองใหม่ได้ ซึ่งทำให้โฟลว์เรียกใช้ขั้นตอนอีกครั้ง

ไฟล์ Manifest จะกำหนดขั้นตอน

JSON

{
  "timeZone": "America/Toronto",
  "dependencies": {},
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "addOns": {
    "common": {
      "name": "Retry Errors Example",
      "logoUrl": "https://www.gstatic.com/images/icons/material/system/1x/pets_black_48dp.png",
      "useLocaleFromApp": true
    },
    "flows": {
      "workflowElements": [
        {
          "id": "retryError",
          "state": "ACTIVE",
          "name": "Retry an error",
          "description": "Simulates a temporary failure and retries the step.",
          "workflowAction": {
            "inputs": [
              {
                "id": "value1",
                "description": "Any input value",
                "cardinality": "SINGLE",
                "dataType": {
                  "basicType": "STRING"
                }
              }
            ],
            "outputs": [
              {
                "id": "output_1",
                "description": "The output",
                "cardinality": "SINGLE",
                "dataType": {
                  "basicType": "STRING"
                }
              }
            ],
            "onConfigFunction": "onRetryConfiguration",
            "onExecuteFunction": "onRetryExecution"
          }
        }
      ]
    }
  }
}

โค้ดต่อไปนี้สร้างการ์ดการกำหนดค่าและจัดการตรรกะการลองใหม่

Apps Script

/**
 * Returns a configuration card for the step.
 * This card contains a text input field for the user.
 */
function onRetryConfiguration() {
  let section = CardService.newCardSection()
    .addWidget(CardService.newTextInput()
      .setFieldName("value1")
      .setId("value1")
      .setTitle("Enter any value"));
  const card = CardService.newCardBuilder().addSection(section).build();
  return card;
}

/**
 * Executes the step and simulates a transient error.
 * This function fails 80% of the time. When it fails, it returns an
 * error that can be retried.
 * @param {Object} e The event object from the workflow.
 */
function onRetryExecution(e) {
  try {
    // Simulate a transient error that fails 80% of the time.
    if (Math.random() < 0.8) {
      throw new Error('Simulated transient failure!');
    }

    // If execution is successful, return the output variable and a log.
    var input_value = e.workflow.actionInvocation.inputs["value1"].stringValues[0];
    const styledText = AddOnsResponseService.newStyledText()
      .setText(`Execution succeeded for input: ${input_value}`);

    const workflowAction = AddOnsResponseService.newReturnOutputVariablesAction()
      .setVariables({
        "output_1": AddOnsResponseService.newVariableData().addStringValue(input_value)
      })
      .setLog(AddOnsResponseService.newWorkflowTextFormat()
        .addTextFormatElement(
          AddOnsResponseService.newTextFormatElement().setStyledText(styledText)
        ));

    let hostAppAction = AddOnsResponseService.newHostAppAction().setWorkflowAction(workflowAction);
    return AddOnsResponseService.newRenderActionBuilder().setHostAppAction(hostAppAction).build();

  } catch (err) {
    // If a transient error occurs, return an error message saying the step tries to run again.
    Logger.log('A error occurred, trying to run the step again: ' + err.message);

    const workflowAction = AddOnsResponseService.newReturnElementErrorAction()
      // Sets the user-facing error message.
      .setErrorLog(
        AddOnsResponseService.newWorkflowTextFormat()
        .addTextFormatElement(
          AddOnsResponseService.newTextFormatElement().setText("A temporary error occurred. The step will be retried."))
      )
      // Makes the error not actionable by the user.
      .setErrorActionability(AddOnsResponseService.ErrorActionability.NOT_ACTIONABLE)
      // Specifies that the error is automatically retried.
      .setErrorRetryability(AddOnsResponseService.ErrorRetryability.RETRYABLE);

    let hostAppAction = AddOnsResponseService.newHostAppAction().setWorkflowAction(workflowAction);
    return AddOnsResponseService.newRenderActionBuilder().setHostAppAction(hostAppAction).build();
  }
}