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
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
flecha check curriculum/main-evidence/single/error_values.flflecha build curriculum/main-evidence/single/error_values.fl -o build/error_valuesbuild/error_valuesSaída esperada
42status de saída: 0Referência relacionada: /examples/error_values/.