Ejecutar

Errores y reintentos

En un run pueden ir mal dos cosas distintas: un paso informa de un problema, o el propio motor falla. Se tratan de forma diferente, y la diferencia es lo más importante de esta página.

Qué ha ido malQué hace el motor
Un paso fallaHTTP 404 o 500, un valor del tipo incorrecto, un valor ausente, un permiso denegadoLa ejecución termina como `failed` de inmediato. El paso fallido se muestra con su error.Sin reintento automático. Arregla la causa y pulsa «Reintentar». Dentro de un paso Intentar, el run continúa después del Intentar.
El motor se rompeun error inesperado, un fallo puntual de la base de datosLa ejecución espera 30 segundos, luego 60 segundos, y lo intenta de nuevo, hasta tres intentos en total.Solo se repite el trabajo fallido; los pasos terminados se reproducen desde el diario.
La definición no se puede ejecutarversión no válida, un límite superado, un paso que esta compilación no conoceLa ejecución termina como `failed` sin reintento: el intento siguiente fallaría igual.Reintentar a mano reproduce el mismo error.
Un worker muere a mitad de ejecuciónCuando vence el lease (300 segundos), el tick del minuto siguiente retoma la ejecución. Retomarla cuesta un intento.Tras tres intentos termina como failed.
Cuando algo sale mal

Cuando un paso informa de un error, como un HTTP 404, un permiso denegado, un valor del tipo equivocado, un valor ausente o un límite que el paso supera, el run termina como fallido al instante. No hay reintento del paso ni opción en el paso para continuar. La única forma de seguir tras un fallo es poner el paso dentro de un «Intentar» ; consulta Seguir adelante tras un fallo.

  • Un paso fallido no se cobra.
  • El motor no reintenta ante un 500 de tu servidor ni ante un timeout. Corrige la causa y pulsa Reintentar en la ejecución.
  • El error se guarda en el paso, así que el visor de ejecuciones muestra exactamente qué paso se detuvo y por qué.

El «Intentar» ("Si un paso falla, continúa") no tiene campos y tiene un cuerpo, como un bucle. Ejecuta los pasos de dentro. Si uno de ellos falla, los pasos que le siguen dentro del cuerpo se omiten y el run continúa con el paso que sigue al Intentar, en lugar de terminar como fallido.

Un Intentar publica solo su resultado, como «Resultado del intento». Las variables que crearon los pasos de dentro no salen: tras un fallo, algunas pueden no existir.

CampoTipoValor
«Ha fallado» (failed)Verdadero o falsoFalso si todos los pasos de dentro se completaron, verdadero si uno falló.
«Mensaje de error» (errorMessage)TextoEl mensaje del paso que falló. Vacío cuando nada falló, así que siempre puedes compararlo como texto.
  • Captura los fallos de los pasos: una respuesta HTTP que no es 2xx, el error que devuelve una acción, un valor no válido y un crédito agotado. Un bucle que supera sus vueltas también es un fallo de paso.
  • No captura lo que no es un fallo de paso. Una avería del motor (se reintenta como se describe en la sección siguiente), un error fatal (listado después) y un Salto lo atraviesan, y también una espera: una espera dentro de un Intentar aparca el run como siempre.
  • Pasos Intentar anidados: el más interno captura el fallo.
  • El propio paso Intentar no gasta crédito ni ocupa posición en el run. Los pasos de dentro cuentan como siempre; un paso que falló no se cobra.
  • En «Desarrollo a medida», el mensaje de un fallo dentro de un Intentar es el genérico.

El patrón: Intentar y luego una condición sobre failed

Enlace a esta sección: El patrón: Intentar y luego una condición sobre failed
  1. Envuelve los pasos que pueden fallar

    Añade un «Intentar» y suelta dentro los pasos que pueden fallar, como una petición HTTP a un sistema que a veces está caído.

  2. Comprueba el resultado

    Después del Intentar, añade una «Condición» en «Resultado del intento» «Ha fallado» (es igual a verdadero).

  3. Indica qué hacer

    En la rama del fallo, avisa a alguien, crea una tarea o toma otro camino, usando el mensaje de error en el texto. En la otra rama, sigue adelante.

  • Si no compruebas el resultado, el fallo es silencioso: el run continúa y nadie se entera. Pon la comprobación después del Intentar.
  • Un run en el que se capturó cada fallo termina como completado, y no se envía ningún aviso de fallo.
  • En el visor de runs, el paso que falló dentro del Intentar aparece marcado como error capturado (rojo atenuado, discontinuo). El propio panel del Intentar muestra el mensaje, o "Sin errores".
  • Cuando un run se reanuda tras una espera, un fallo capturado se repite en el mismo punto a partir del registro: el paso que falló no se vuelve a ejecutar.
Nota:

Pulsar Reintentar en un run fallido nunca vuelve a ejecutar un fallo capturado: solo se vuelven a ejecutar los fallos que terminaron el run.

Si el propio motor lanza un error (una excepción inesperada, un problema de base de datos), la ejecución no se marca como fallida de inmediato. Espera y lo vuelve a intentar, tres intentos en total:

IntentoSi fallaEsperar antes del siguiente
1stEstado «En espera»30 segundos
2ndEstado «En espera»60 segundos
3rdEstado «Fallido»Ninguno: es definitivo
  • Las esperas son mínimos: la ejecución la despierta el siguiente tick de un minuto, así que cada una puede durar hasta aproximadamente un minuto más.
  • Solo se repite el trabajo fallido. Los pasos completados se reproducen desde el registro y no cuestan nada.
  • Un paso de espera no es un intento fallido y no gasta uno. Un workflow con tres esperas no se queda sin intentos.
  • Un worker que muere a mitad de ejecución se detecta cuando caduca su lease de cinco minutos. El relevo cuenta como un intento. Si la ejecución ya estaba en el tercero, termina como fallida con "the run died 3 times without completing; it is not retried again".

Algunos errores fallarían igual cada vez y solo repetirían de paso los efectos de un paso, así que terminan la ejecución como fallida de inmediato:

CódigoMensaje (traducido)Causa
invalid_definitionLa versión congelada no es una definición válidaUna versión publicada antes de que la validación fuese más estricta, o una que el motor no puede leer.
unknown_action, unknown_step_typeLa definición usa una acción o un paso que esta versión no conoceEl workflow lo guardó una versión del motor más nueva o más antigua.
jump_target_not_foundEl salto apunta a un paso que no está en el ámbitoUn paso «Saltar a un paso anterior» cuyo destino ya no existe.
task_budget_exceededLa ejecución superó el presupuesto de 1000 pasosDemasiados pasos en un run, normalmente por un bucle.
replay_too_largeEl registro de la ejecución tiene más de 1000 pasos; no se puede reanudarUn run que creció demasiado para reanudarse tras una espera.
feeder_collection_too_largeLa iteración resolvió más de 500 elementosUn paso Iterar sobre una colección demasiado grande. No se procesa nada.

El límite del bucle es un fallo de paso, no un error del motor: termina el run como fallido (salvo que el bucle esté dentro de un Intentar) con "el bucle superó las N vueltas permitidas", y Reintentar lo reproduce.

  • En la tarjeta de la ejecución, una ejecución fallida muestra el mensaje de error en rojo. El código de error no aparece ahí. Si no hay mensaje, la tarjeta dice "Algo ha fallado durante la ejecución".
  • Haz clic en el paso fallido. Su panel se abre en el «Error» pestaña con, cuando existen: «Estado HTTP» (para HTTP), «Respuesta» (el cuerpo), «Campos» (qué campo y por qué), «Detalles» y «Código».
  • Un paso que ha fallado porque un impuesto no está asignado en un paquete de contabilidad muestra un botón, «Asignar el impuesto en {{provider}}», que abre el mapa. Después de guardarlo, la app ofrece reintentar las ejecuciones que quedaron bloqueadas.
  • Los mensajes que escribe el motor están en español sea cual sea el idioma de la app. Los mensajes de esta documentación son traducciones.
CódigoSignificado
forbiddenEl creador del workflow no tiene el permiso, o la acción está bloqueada por un plan, un add-on, un proveedor que no está conectado o los créditos de IA. El mensaje nombra la acción.
invalid_inputLas entradas no cumplen lo que exige la acción, con una línea por cada campo que falla.
not_foundLa acción no existe, o no existe el registro sobre el que trabaja.
execution_errorFalló la propia acción; el mensaje es el que produjo.

Pulsar «Reintentar» en una ejecución fallida. Usa la misma ejecución, reinicia sus intentos a cero, elimina solo los registros fallidos y empieza de nuevo: los pasos completados se reproducen y el paso fallido se ejecuta en vivo. Ejecuta la versión con la que empezó la ejecución, así que editar el workflow no la cambia. No comprueba tu crédito antes de ponerla en cola; si no hay, la ejecución se pausa en el paso que lo necesita. No hay forma de aportar una entrada distinta.

Un run no repite los pasos ya terminados. Pero si un worker muere después de que ocurriera el efecto de un paso y antes de que Filmo registrara que el paso terminó (una ventana muy breve), el paso se ejecuta de nuevo. Filmo reduce esa ventana en tres capas y no afirma cerrarla:

CapaProtege contra
La clave de la ejecuciónDos runs por un mismo hecho: la misma entrega de webhook, el mismo evento, la misma ocurrencia de la programación.
El registro de la ejecuciónRehacer trabajo ya hecho dentro de una ejecución.
Una clave por pasoHacer un efecto dos veces entre intentos. Las peticiones HTTP que no son GET la llevan como Idempotency-Key; el email enviado desde Filmo y los eventos de calendario pasan una clave al proveedor. Otras escrituras, incluidos los envíos desde el buzón y los envíos a paquetes de contabilidad, las protege Filmo durante 24 horas y, en contabilidad, el enlace entre el documento de Filmo y el del paquete. Anular en Xero usa una clave propia por enlace.

Al menos una vez

Considera los efectos de un paso como al menos una vez, no exactamente una. Haz que el extremo receptor ignore una repetición cuando importe, usando la cabecera Idempotency-Key que envía el paso HTTP.

En los ajustes del workflow, «Avisar si falla» ofrece «Notificación interna y email» (el valor por defecto), «Solo notificación interna», «Solo email» y «No notificar».

  • Las personas avisadas son el creador del workflow, si todavía tiene acceso a la empresa; si no, todos los administradores (propietarios y administradores; el rol de soporte de Filmo nunca recibe el aviso). Nunca la persona que pulsó el botón.
  • Se envía un aviso interno en cada fallo, con el nombre del workflow y el principio del error (cortado a 200 caracteres), enlazando a la ejecución.
  • Se envía como máximo un email por hora y por workflow, sea cual sea el fallo que llegue primero. El email nombra el workflow y enlaza a la ejecución; no incluye el motivo. La hora se gasta aunque el email falle al enviarse.
  • Una pausa, una cancelación y un intento fallido que se va a reintentar no envían nada. El aviso se envía cuando el run ha terminado como fallido. Un run cuyos fallos capturó todos un Intentar termina como completado y no envía ninguno.
  • Como el email se limita a uno por hora, una ráfaga de fallos produce un email y muchos avisos internos.
Consejo:

Combina un workflow que no debe fallar en silencio con la notificación interna, que no tiene límite de frecuencia, y con un vistazo rápido a la ejecución.

  • Ejecutar

    Runs

    Un run es una ejecución de un workflow. Cada run guarda lo que hizo, paso a paso, para que puedas ver dónde se detuvo y por qué.

  • Ejecutar

    Límites y créditos

    El motor aplica cada uno de los límites siguientes. La última columna dice qué ocurre cuando lo alcanzas, porque esa suele ser la pregunta.

  • Ejecutar

    Resolución de problemas

    Empieza por lo que ves: el workflow no se ejecutó, una ejecución falló o una ejecución no avanza. Cada sección enumera las causas probables en el orden en que conviene comprobarlas.

¿Te ha resultado útil esta página?