Pular para o conteúdo

3. Erros e testes

Falhas esperadas são valores. Defina uma família error, retorne-a junto de qualquer dado de sucesso e examine-a antes de consumir o resultado. Reserve operações crashable para contextos onde terminar seja a política declarada; não esconda falhas comuns de I/O, parsing ou alocação.

Testes ficam em módulos _test.fl pareados e recebem um testing::UnitTest. Prepare entradas, chame o comportamento exportado e verifique resultado e erro. longbow test compila o mesmo grafo de módulos do aplicativo e retorna valor não zero se algum teste falhar.

Use valores de erro, funções crashable e testes como contratos técnicos.

Exemplo testado

Torne a falha de divisão explícita, amplie um erro nomeado deliberadamente e imprima só o sucesso.

Arquivo: curriculum/main-evidence/single/error_values.fl

curriculum/main-evidence/single/error_values.fl
error MathError {
DivisionByZero,
Overflow,
}
error ParseIssue {
InvalidDigit,
}
(i32, MathError) divide(i32 numerator, i32 denominator) {
if denominator == 0 {
return (0, MathError.DivisionByZero);
}
return (numerator / denominator, none);
}
// A named error widens to error, including inside returned tuples.
(i32, error) calculate(i32 numerator, i32 denominator) {
return divide(numerator, denominator);
}
i32 main() {
quotient, err := divide(84, 2);
if err != none { return 1; }
i32 unused, error failure = calculate(1, 0);
if failure != MathError.DivisionByZero { return 2; }
// One generic variable can hold failures from different families.
failure = ParseIssue.InvalidDigit;
if failure == MathError.DivisionByZero { return 3; }
// Success is explicit; uninitialized error variables cannot be read.
MathError success = none;
failure = success;
if failure != none { return 4; }
const MathError fixed = MathError.Overflow;
MathError first, second = (fixed, success);
if first != MathError.Overflow or second != none { return 5; }
stdoutln(quotient);
return 0;
}

O bloco acima é o arquivo completo executado pelos comandos abaixo.

A divisão retorna valor e erro separadamente. O chamador testa o erro antes de usar o valor, mantendo a falha visível na assinatura e no ponto de chamada.

Comandos

Comandos
flecha check curriculum/main-evidence/single/error_values.fl
flecha build curriculum/main-evidence/single/error_values.fl -o build/error_values
build/error_values

Saída esperada

Saída esperada
42
status de saída: 0

Referência relacionada: /examples/error_values/.