Pânico e Sinais
Nesta página
Além do encerramento normal, o Zolo oferece dois ganchos para situações
excepcionais: on panic para erros fatais não capturados, e on signal para
sinais enviados pelo sistema operacional.
Gancho de pânico
on panic e recebe a mensagem de erro como string e roda imediatamente quando
panic(...) é chamado sem que haja um try/catch envolvente. Após o bloco
on panic, o runtime ainda dispara os ganchos on shutdown registrados —
útil para gravar logs de falha antes de encerrar:
on panic captura a mensagem de panic("boom") antes que on shutdown
encerre o processo. Rode localmente — o sandbox WASM não executa pânicos
intencionais de forma segura.
// Verifies `on panic` fires before `on shutdown` on uncaught panic.
on panic e {
print("panic hook saw: {e}")
}
on shutdown reason {
print("shutdown reason: {reason}")
}
print("about to crash")
panic("boom")
Requer a CLI/host do Zolo — abra no playground ou rode localmente.
Gancho de sinal
on signal SIGINT { ... } registra um handler para um sinal específico do SO.
O bloco roda de forma assíncrona quando o sinal é entregue ao processo.
process.raise("SIGINT") sintetiza o sinal em-processo — em Windows apenas
SIGINT e SIGTERM têm suporte:
process.raise("SIGINT") entrega o sinal; o hook incrementa fired e
imprime a contagem. process.sleep(50) dá tempo à thread de sinal de enfileirar
o evento antes do próximo ponto de interrupção. Rode localmente para observar
a sequência completa.
// Verifies `on signal` is invoked when a signal is delivered to the process.
// `process.raise` synthesises a signal in-process; on Windows only SIGINT
// (Ctrl+C) and SIGTERM (Ctrl+Break) can be raised this way.
use std::process
var fired = 0
on signal SIGINT {
fired = fired + 1
print("signal hook fired ({fired})")
}
on shutdown reason {
print("shutdown reason: {reason}")
}
print("raising SIGINT...")
process.raise("SIGINT")
// Give the signal thread a beat to enqueue the event before we hit the
// next interrupt check point.
process.sleep(50)
print("after sleep — fired={fired}")
print("done")
Requer a CLI/host do Zolo — abra no playground ou rode localmente.
Desafio
Adicione um segundo on signal SIGINT e verifique que ambos disparam quando
process.raise("SIGINT") é chamado. Depois troque por SIGTERM e confirme que
o primeiro bloco não interfere.