Error
Extensões do protótipo Error
Importação
_ <- fat.type.Error
Aliases
- AssignError: atribuindo um novo valor a uma entrada imutável
- AsyncError: falha na operação assíncrona
- CallError: uma chamada é feita com argumentos insuficientes
- FileError: falha na operação de arquivo
- IndexError: o índice está fora dos limites da lista/texto
- KeyError: a chave (nome) não é encontrada no escopo
- SyntaxError: erro de sintaxe ou estrutura de código
- TypeError: inconsistência de tipo em chamada, retorno ou atribuição de método
- ValueError: tipo pode estar correto, mas conteúdo não é aceito
Construtor
| Nome | Assinatura | Breve descrição |
|---|---|---|
| Error | (val: Any) | Retornar val coagido para texto como erro |
Membros do protótipo
| Nome | Assinatura | Breve descrição |
|---|---|---|
| isEmpty | <> Boolean | Retorna verdadeiro, sempre |
| nonEmpty | <> Boolean | Retorna falso, sempre |
| size | <> Number | Retorna 0, sempre |
| toText | <> Text | Retorna o texto do erro |
| freeze | <> Void | Torna o valor imutável |
| raise | <> Any | Relança o erro armazenado |
Exemplo
_ <- fat.type.Error
# Gerando um erro intencionalmente
x = Error('ops')
x.toText # retorna "Error: ops"
# Causando um erro inadvertidamente
e = undeclared.item # causa um TypeError
e.toText # retorna "TypeError: can't resolve scope of 'item'"
Aliases de erro na prática
# Exemplo de AssignError
x = 10
x = 20 # gera "AssignError: reassignment to immutable > x"
# Exemplo de IndexError
list = [ 1, 2, 3 ]
list[5] # gera "IndexError: out of bounds"
# Exemplo de CallError
add(10) # gera "CallError: nothing to call > add > ..."
Relançando um erro
A partir da v4.6.0, chamar raise em um valor de erro o lança novamente, preservando o tipo e a mensagem originais, de modo que manipuladores envolventes e fallbacks veem o erro original.
Um manipulador que retorna o erro puro já o relança automaticamente (veja a biblioteca failure), então o raise serve para relançamentos adiados: encaixote o erro em um Scope para devolvê-lo inerte, e o relance onde a decisão pertence:
failure <- fat.failure
# encaixote o erro: retorná-lo puro do manipulador o relançaria de imediato
tryTask = (task: Method): Scope -> {
failure.trapWith(err -> ({ value = null, failed = err }))
{ value = task(), failed = null }
}
outcome = tryTask(-> riskyWork())
outcome.failed != null ? outcome.failed.raise # quem chama decide: relançar
outcome.value
Um erro encaixotado pode ser relançado mais de uma vez. Relançar um erro que já é a falha pendente é um no-op.