O sistema de erros do Factor tem três partes: throw para sinalizar um erro,
recover para tratar um, e ERROR: para definir seu próprio tipo de
erro.
throwthrow (em kernel) lança um erro. O argumento pode ser
qualquer valor, uma string, um número ou uma tupla, e ele se torna o
erro que você pode inspecionar depois:
! DOCTEST: SKIP
"file not found" throw
throw não retorna; o resto da palavra atual é ignorado.
recoverrecover (em continuations) é o try/catch do Factor.
Ele recebe uma quotation try e uma quotation recovery:
recover ( try recovery -- )
Se try terminar sem lançar nada, recovery é ignorado. Se try
lançar um erro, o erro é empilhado na pilha e recovery é executado:
[ "boom" throw ] [ drop "caught" ] recover .
! => "caught"
[ "ok" ] [ drop "never runs" ] recover .
! => "ok"
when, do kernel, é o companheiro natural: ele executa uma
quotation apenas quando o topo da pilha é verdadeiro:
: check-positive ( n -- )
0 < [ "negative!" throw ] when ;
ERROR:ERROR: define uma classe de tupla e uma palavra que constrói uma nova
instância e a lança:
! DOCTEST: SKIP
ERROR: not-found path ;
"/missing" not-found
! throws T{ not-found { path "/missing" } }
Um erro sem slots é apenas ERROR: name ;. Chamar name lança uma
instância vazia. Tuplas definidas com ERROR: carregam um predicado de classe
name? que você pode usar para testar se um erro capturado era desse tipo.
Um erro capturado é apenas uma tupla, então cada slot de ERROR: vem com o
mesmo leitor slot>> gerado automaticamente que qualquer outra tupla.
! DOCTEST: SKIP
{
T{ not-found { path "/a" } }
T{ not-found { path "/b" } }
}
[ path>> ] map . ! => { "/a" "/b" }
Elena, a nova gerente de qualidade de uma fábrica de jornais, pede que você escreva um pequeno programa para monitorar a sala de produção.
Defina uma classe de tupla de erro machine-error usando a palavra de
parsing ERROR:. Ela não precisa de slots.
machine-error ! throws a fresh machine-error
Defina check-humidity. Ela pega uma leitura de umidade da pilha
e usa throw para lançar a string "humidity too high" quando a leitura
for estritamente maior que 70. Caso contrário, ela não retorna nada.
50 check-humidity ! returns nothing
80 check-humidity ! throws "humidity too high"
Defina check-temperature. Ela pega uma leitura de temperatura e
usa throw para lançar a string "temperature too high" quando a leitura
for estritamente maior que 500. Caso contrário, ela não retorna nada.
400 check-temperature ! returns nothing
600 check-temperature ! throws "temperature too high"
Defina monitor para pegar uma umidade e uma temperatura da pilha e
rodar as duas verificações. Se qualquer uma das verificações lançar uma
exceção, monitor deve lançar um machine-error novo em vez disso. Se
as duas passarem, monitor não retorna nada.
50 400 monitor ! returns nothing
80 400 monitor ! throws a machine-error
50 600 monitor ! throws a machine-error
Defina monitor-batch para pegar um array de leituras
{ humidity temperature } e retornar quantas delas falhariam (ou seja,
quantas fariam monitor lançar uma exceção).
{ { 50 400 } { 80 400 } { 50 600 } { 60 200 } } monitor-batch .
! => 2
Crie sua conta no Exercism para aprender e dominar Factor com 47 conceitos163 exercícios e mentoria humana de verdade, tudo de graça.