> For the complete documentation index, see [llms.txt](https://docs.skail.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.skail.dev/opere/retomada-manual-de-execucoes-falhas.md).

# Retomada manual de execuções falhas

Quando uma execução esgota as tentativas, ela fica como falha no Monitor com a exceção e a linha do tempo. Depois de corrigir a causa, você a retoma dali: o que já rodou não repete, só o que faltava executa.

## Quando você precisa disto

Uma execução aparece como falha. As causas típicas:

* um serviço externo ficou fora por mais tempo que o `retryCount` cobriu;
* um dado inválido no seu banco fez um command lançar exceção;
* um bug no código de um command;
* um deploy que mudou o fluxo com execuções em andamento (`SkailNonDeterministicException`).

## O que acontece na retomada

A execução é entregue de novo à sua aplicação. O runtime reexecuta a function sobre o histórico da execução:

* todos os commands que já gravaram resultado devolvem o gravado sem executar;
* delays vencidos e eventos recebidos estão concluídos;
* o passo que falhou executa de novo, e o fluxo segue.

É o mesmo mecanismo do replay automático. Ver [Determinismo e replay](/construa/conceitos/replay-e-determinismo.md).

Na prática, retomar é seguro em relação às operações externas já feitas. A cobrança que deu certo não é refeita; a nota que foi emitida não é reemitida. O que executa é o command que estava falhando e os que vêm depois.

## Procedimento

1. Abra a execução no Monitor e leia a exceção e o passo em que ela ocorreu.
2. Corrija a causa.
   * Serviço externo fora: aguarde voltar.
   * Dado inválido: corrija no seu banco.
   * Bug no command: corrija o código e publique (o corpo de um command pode mudar sem versionar).
   * Fluxo alterado: publique de volta a versão com a sequência original de `await`s.
3. Retome a execução no Monitor.
4. Acompanhe: ela volta a Em execução, o passo que falhava conclui, e a function segue até concluir ou até a próxima espera.

{% hint style="info" %}
Para muitas execuções falhas pela mesma causa (o gateway ficou fora por uma hora), corrija uma vez e retome as execuções afetadas.
{% endhint %}

## Quando não retomar

Com `SkailNonDeterministicException` sem ter corrigido o código: a retomada vai falhar de novo com a mesma exceção, porque o histórico e o código continuam divergindo. Primeiro publique o código compatível.

Quando a falha era de negócio e foi lançada como exceção num command com retry ligado (cartão recusado lançando `CartaoRecusadoException`): retomar vai cobrar de novo e ser recusado de novo. Corrija o command para devolver resultado (ou passe a tratar a exceção na function, com `retryCount: 0`), publique e decida caso a caso o que fazer com as execuções.

Quando a operação externa já aconteceu e o command não é idempotente: a retomada executa o command de novo. Confira no sistema externo antes; ver [Como escrever commands idempotentes](/construa/como-fazer/escrever-commands-idempotentes.md).

## O que observar

Após retomar:

* a execução saiu de Falha;
* o command que falhava aparece concluído na linha do tempo;
* nenhuma duplicidade no sistema externo.

Se falhar de novo com a mesma exceção, a causa não foi corrigida.

## Próximos passos

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><i class="fa-rotate">:rotate:</i></td><td><strong>Falhas, retries e idempotência</strong></td><td>Explica como uma execução chega ao estado de falha.</td><td><a href="/construa/conceitos/retries-e-idempotencia.md">Retries e idempotência</a></td></tr><tr><td><i class="fa-display">:display:</i></td><td><strong>Monitor</strong></td><td>Mostra a linha do tempo da execução, com a exceção e o passo em que ela parou.</td><td><a href="/referencia/portal/monitor.md">Monitor</a></td></tr><tr><td><i class="fa-screwdriver-wrench">:screwdriver-wrench:</i></td><td><strong>Troubleshooting</strong></td><td>Lista sintomas comuns com a causa provável e o que fazer.</td><td><a href="/opere/troubleshooting.md">Troubleshooting</a></td></tr></tbody></table>
