Neste guia, explicamos como gerenciar erros do Workspace Studio que ocorrem durante a execução de uma etapa. Os erros são exibidos na guia "Atividade".
Quando um erro ocorre, você pode especificar se a etapa deve:
- Retornar um erro acionável: adicione um botão ao
registro de erros que direcione o usuário
ao card de configuração da etapa, permitindo que ele modifique as entradas para
resolver o erro. Para marcar um erro como acionável, retorne
AddOnsResponseService.ErrorActionability.ACTIONABLE. Para marcar um erro como não acionável, retorneAddOnsResponseService.ErrorActionability.NOT_ACTIONABLE. - Tentar novamente a etapa após um erro: o fluxo tenta executar a etapa de novo até cinco vezes antes de parar. Para marcar um erro como um que pode ser
repetido, retorne
AddOnsResponseService.ErrorRetryability.RETRYABLE. Para marcar um erro que não pode ser repetido, retorneAddOnsResponseService.ErrorRetryability.NOT_RETRYABLE.
Também é possível criar registros de erros personalizados com chips, hiperlinks e texto estilizado para fornecer aos usuários um contexto mais detalhado sobre o erro.
Retornar um erro acionável
O exemplo a seguir cria uma etapa que pede um número negativo ao usuário. Se o usuário inserir um número positivo, a etapa vai retornar um erro acionável na guia Atividade, pedindo que ele corrija a entrada.
O arquivo de manifesto a seguir define as entradas, saídas e funções da etapa a serem chamadas para configuração e execução.
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": "handle_error_action",
"state": "ACTIVE",
"name": "Handle 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"
}
}
]
}
}
}
O código a seguir cria o card de configuração e processa a lógica de execução, incluindo o tratamento de erros.
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.
*/
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()
.setVariableDataMap(
{
"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) {
Logger.log('An error occurred: ' + err.message);
// If an error occurs, return an actionable error action.
const workflowAction = AddOnsResponseService.newReturnElementErrorAction()
// Sets the user-facing error message.
.setErrorLog(
AddOnsResponseService.newWorkflowTextFormat()
.addTextFormatElement(
AddOnsResponseService.newTextFormatElement()
.setText("Failed due to invalid input values!"))
)
// Makes the error actionable, letting the user 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();
} finally {
console.log("Execution completed")
}
}
Tentar novamente a etapa após um erro
O exemplo a seguir cria uma etapa que simula uma falha temporária. Se um erro ocorrer, a etapa vai retornar um erro que pode ser repetido, fazendo com que o fluxo execute a etapa novamente.
O arquivo de manifesto define a etapa.
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"
}
}
]
}
}
}
O código a seguir cria o card de configuração e processa a lógica de nova tentativa.
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.
*/
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('An 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();
} finally {
console.log("Execution completed")
}
}