Pular para o conteúdo

Códigos de erro

O que cada código significa, com exemplo e solução.

Todo erro do DataForge carrega um código estável. Ele aparece no relatório e serve para procurar aqui — ou no terminal, com dataforge explain.

bash
dataforge explain DF0601

Anatomia de um erro#

text
erro[DF0601]: Key "b" is not in this vault.
  ┌─ exemplo.df:2:5
  │
1 │ v := {"nome": "ana"}
2 │ out v["b"]
  │     ^^^^^^ key read here
  │
  = nota: the vault has 1 key: "nome"
  = dica: use  valor ?? padrao, ou vault.has(chave) antes de ler
  = doc:  https://dataforge-lang.vercel.app/docs/colecoes
ParteO que traz
erro[DF0601]o código, para procurar
┌─ arquivo:linha:colunaonde
O trechoduas linhas de contexto, com a que falhou destacada
^^^^ e o rótuloo que exatamente falhou
nota:contexto que ajuda a entender
dica:o que fazer
doc:a página que trata do assunto

A separação entre nota e dica é deliberada: a mensagem diz o que houve, a dica diz o que fazer. Misturar as duas produz textos longos que ninguém lê.

As famílias#

FaixaSobre
DF01xxsintaxe — lexer e parser
DF02xxexecução
DF03xxtipos e OOP
DF04xxnomes
DF05xxmódulos
DF06xxíndice e chave
DF07xxerro lançado pelo programa
DF08xxrecursão

DF0101 — Indentacao inconsistente#

DataForge usa indentacao para delimitar blocos, e aceita apenas espacos. Um caractere de tabulacao no meio de linhas indentadas com espaco produz um bloco que o leitor ve de um jeito e o parser ve de outro.

dataforge
given x bigger 0:
    out "com espacos"
	out "com tab"      // <- SyncError

DF0102 — Caractere inesperado#

O lexer encontrou um simbolo que nao faz parte da linguagem. A causa mais comum e usar '=' para atribuir. Em DataForge a atribuicao e ':=' — o '=' sozinho nao existe.

dataforge
x = 10        // errado
x := 10       // certo

DF0103 — Erro de sintaxe#

O parser encontrou um token onde esperava outro. A mensagem diz o que esperava; a coluna marca onde. Causas frequentes: - falta ':' no fim de um cabecalho (given, cycle, action, blueprint) - parentese ou colchete sem fechar - 'otherwise' sem o 'given' correspondente

dataforge
given x bigger 0        // falta ':'
    out "positivo"

given x bigger 0:       // certo
    out "positivo"

DF0201 — Erro em tempo de execucao#

O programa foi analisado sem problema, mas falhou ao rodar. Divisao por zero, conversao impossivel e reatribuicao de 'steady' caem aqui.

dataforge
out 10 / divisor          // se divisor for 0, estoura aqui

given divisor isnt 0:     // a guarda evita
    out 10 / divisor

DF0301 — Tipo incompativel#

Uma operacao recebeu um tipo que nao aceita, ou uma anotacao foi contrariada. Tambem aparece em OOP: metodo de instancia chamado no blueprint, spawn de blueprint abstrato, escrita em propriedade so-leitura, e blueprint que nao implementou o que o trait exige.

dataforge
action dobro(n: Integer) -> Integer:
    yield n * 2

out dobro("texto")        // String onde se esperava Integer

DF0401 — Nome nao definido#

O nome nao existe em nenhum escopo visivel deste ponto. Quando ha algo parecido, a mensagem sugere — o caso mais comum e erro de digitacao. Quando nao ha, geralmente o nome foi usado antes de receber valor, ou esta em outro escopo.

dataforge
contador := 0
out contadr        // DF0401: voce quis dizer 'contador'?

DF0501 — Modulo nao encontrado#

O 'adopt' procurou em tres lugares e nao achou: 1. biblioteca padrao (Arcane.*) 2. arquivos ao lado do que faz o import 3. forge_modules/, subindo ate achar um forge.toml

dataforge
adopt validador as V      // se nao instalado, DF0501

DF0601 — Indice ou chave invalida#

Leitura fora da faixa de um cluster, ou de uma chave que o vault nao tem. Em cluster de n itens, os indices validos vao de 0 a n-1 — ou de -1 a -n contando do fim. O erro classico e usar len(x) como indice, quando o ultimo e len(x) - 1.

dataforge
itens := [10, 20, 30]
out itens[3]        // DF0601: so ha 0, 1 e 2
out itens[-1]       // 30, o ultimo

v := {"nome": "ana"}
out v["idade"]      // DF0601: a chave nao existe

DF0701 — Erro lancado pelo programa#

Alguem chamou 'trigger'. Nao e uma falha da linguagem: e o programa sinalizando uma condicao que ele mesmo considera invalida.

dataforge
action sacar(saldo, valor):
    given valor bigger saldo:
        trigger "saldo insuficiente"
    yield saldo - valor

DF0801 — Recursao profunda demais#

A pilha passou de mil quadros. Quase sempre e recursao sem caso base, ou com um caso base que nunca e alcancado.

dataforge
action contar(n):
    yield contar(n - 1)     // nunca para

action contar(n):
    given n smaller_eq 0:   // caso base
        yield 0
    yield contar(n - 1)

Pilha de chamadas#

Quando o erro acontece dentro de uma ação, o relatório mostra o caminho até ele:

text
  pilha de chamadas (mais recente primeiro):
    em media                  relatorio.df:8
    em resumo                 relatorio.df:10