# Exception Handler

Diversos problemas podem ocorrer ao interagir com sistemas externos. Esses problemas podem ser decorrentes de falhas de comunicação ou problemas no nível da aplicação. De qualquer forma, precisamos estar preparados para reagir a problemas mais comuns de forma automática ou identificar e reportar problemas não esperados. Para manipular todas as possíveis exceções vamos utilizar os **"Exception Handlers"** (EH).

{% hint style="info" %}
Os "Exception Handlers" podem ser aplicados a qualquer tipo de módulo, exceto os "Gatilhos".
{% endhint %}

***

### Conceito <a href="#conceito" id="conceito"></a>

Um **"Exception Handler"** é um conjunto de Exception Rules (Regras de Exceção) com uma mesma ação padrão. Os EH são aplicados a cada módulo dentro de um fluxo. Você pode aplicar múltiplos EH em um mesmo módulo para cobrir diversos tipos de exceções.

<figure><img src="https://content.gitbook.com/content/lGHvosl2xodpQaXzCzxY/blobs/SeF9zw6ulsEtlHZZpb1s/Frame%2026.png" alt=""><figcaption><p>Organização dos Exception Handlers no <strong>Skyone Studio</strong></p></figcaption></figure>

**Exception Rule - ER**

A unidade de identificação e tratamento de exceções é a Exception Rule - **ER** (Regra de Exceção). A **ER** contém a definição do tipo de ERRO que está se buscando tratar. Todos os erros observados em um fluxo geram algum tipo de mensagem de erro. A **ER** nos permite especificar uma expressão regular que é aplicada sobre essa mensagem para filtrar um tipo específico de erro.

Por exemplo, uma chamada REST que retorna um erro 400 apresenta uma mensagem de erro como abaixo.

```json
ERROR: treatment_error
KNOWN_STACK:
component_error
execute_operation_error
http_operation_error
treatment_error <--
TREATMENT_INFO:
{
  "responseHeader": {
  "status": 400,
  "properties": {
    "content-type": "application/json",
    "content-length": "36",
    "server": "Werkzeug/2.0.2 Python/3.8.10",
    "date": "Sun, 26 Feb 2023 15:33:15 GMT"
    }
  }
}
```

Podemos criar uma regra para filtrar essa mensagem apenas utilizando o status code fornecido. A expressão regular será:

```
"status": 400
```

No mesmo **ER** podemos definir a quantidade de tentativas adicionais que a **Skyone Studio** irá executar e o intervalo entre essas tentativas, além da notificação gerada a cada vez que a expressão é encontrada.

**Default Action - DA**

As ERs permitem especificar a quantidade de re-tentativas e o intervalo entre elas. Porém, quando as tentativas adicionais falham, podemos definir uma ***Default Action*** ou ação padrão que é executada ao final das tentativas.

As três ações disponíveis são:

* **Parar**: O fluxo é interrompido completamente.
* **Continuar**: Mesmo após a ocorrência de um erro, o fluxo continua e o erro é registrado nos logs.
* **Loop**: Em vez de seguir adiante no fluxo, essa ação faz com que o processo retorne ao início do fluxo.

Para cada uma das ações acima é possível também definir notificações próprias e seus destinos.

**Exception Handler (EH)**

Podemos criar diversas **ER** dentro de um **EH**. Com isso podemos agrupar em um mesmo **EH** diversas regras que tenham um mesmo tratamento padrão ou ***Default Action*****&#x20;(DA)**. Por exemplo, podemos criar duas regras específicas para tratar os códigos de resposta HTTP 404(Not Found) e 403(Forbidden), mas no caso de falha das re-tentativas, ambas serão tratadas pela mesma **DA**.

**Módulos**

Na configuração de módulo dentro do fluxo podemos especificar quais **EH** serão utilizados. Múltiplos **EH** podem ser empilhados e serão inspecionados na ordem que foram selecionados.

A possibilidade de especificar múltiplos **EH** em um módulo permite cobrirmos todos os tratamentos de exceções com um conjunto de **EH** que foram criados para lidar com exceções específicas.

***

**Processamento**

O diagrama abaixo ilustra o mecanismo de processamento dos **EH**.

<figure><img src="https://content.gitbook.com/content/lGHvosl2xodpQaXzCzxY/blobs/2hxb4UZnBFg1R9NT6QQz/Frame%2027.png" alt=""><figcaption><p>Diagrama de Processamento do Exception Handler</p></figcaption></figure>

**Diagrama de Processamento do Exception Handler**

Toda a chamada de um módulo pode apresentar uma exceção. Quando isso acontece, o **Skyone Studio** irá verificar se existe algum **EH** configurado no módulo.

Quando não existe, **Skyone Studio** irá tratar a exceção da forma tradicional.

**Tratamento Tradicional de Exceções**

O **Skyone Studio** assume o seguinte comportamento com relação as exceções na ausência de um **EH**:

* Módulos REST: O erro é registrado nos logs de execução e torna-se disponível para manipulação pelos módulos seguintes. O fluxo segue a execução para o módulo seguinte.
* Outros Módulos: O erro é registrado nos logs de execução e o fluxo é interrompido indicando falha de execução.

**Tratamento de Exceções com o Exception Handler**

Na presença de um ou mais **EH**, o **Skyone Studio** segue os seguintes passos:

1. Seleciona o primeiro **EH** da lista de EHs aplicados no módulo
2. Seleciona a primeira **ER** da lista de ERs dentro do **EH.**
3. Avalia a expressão regular dessa **ER** contra a mensagem da exceção sendo analisada
4. Caso exista match (encaixe), o **Skyone Studio** verifica se existe alguma notificação a ser gerada e executa. Na sequência, o Skyone Studio verifica se existe alguma especificação de re-tentativas. Caso afirmativo, verifica se o contador de re-tentativa ainda é positivo. Nesse caso o **Skyone Studio** aguarda o tempo especificado de delay antes de decrementar a quantidade de re-tentativas e retornar o fluxo para uma nova requisição da chamada.
5. Caso exista o match e a quantidade de re-tentativas atinja zero, o **Skyone Studio** segue para a **Default Action**. No **DA** é possível especificar uma notificação distinta e tomar uma de três ações de fluxo:

   a) Seguir a execução para o próximo módulo

   b) Interromper a execução com respectiva geração de erro

   c) Seguir para a próxima execução do loop mais interno onde se encontra o módulo.
6. Caso não exista o match na primeira **ER,** o **Skyone Studio** segue para a avaliação das regras seguintes.
7. Caso exista uma regras com a **flag ANY,** o **Skyone Studio** a executa como última na lista de **ER** e garante o seu match, independente de qualquer expressão regular.
8. Caso não exista nenhum **match** nas regras de um **EH**, o **Skyone Studio** segue para a avaliação do próximo **EH.**
9. Caso nenhuma **ER** de nenhum **EH** resultar em **match**, o **Skyone Studio** irá tratar a exceção da forma tradicional.

***

**Próximos Passos:**

* [Configuração do Exception Handler](https://docs.skyone.cloud/skyone-studio/integracoes/fluxos/gestao-dos-fluxos/flow-canva-configuracao-e-edicao-do-fluxo/exception-handler/configuracao-do-exception-handler)
* [Cases do Exception Handler](https://docs.skyone.cloud/skyone-studio/integracoes/fluxos/gestao-dos-fluxos/flow-canva-configuracao-e-edicao-do-fluxo/exception-handler/cases-do-exception-handler)
