Pánico y Señales
En esta página
Además del cierre normal, Zolo ofrece dos ganchos para situaciones
excepcionales: on panic para errores fatales no capturados, y on signal
para señales enviadas por el sistema operativo.
Gancho de pánico
on panic e recibe el mensaje de error como cadena y se ejecuta inmediatamente
cuando panic(...) es llamado sin un try/catch que lo envuelva. Tras el
bloque on panic, el runtime aún dispara los ganchos on shutdown registrados
— útil para escribir registros de fallo antes de cerrar:
on panic captura el mensaje de panic("boom") antes de que on shutdown
cierre el proceso. Ejecuta localmente — el sandbox WASM no ejecuta pánicos
intencionales 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")
Requiere la CLI o el host de Zolo; ábrelo en el playground o ejecútalo localmente.
Gancho de señal
on signal SIGINT { ... } registra un manejador para una señal específica del
SO. El bloque se ejecuta de forma asíncrona cuando la señal es entregada al
proceso. process.raise("SIGINT") sintetiza la señal en el proceso — en
Windows solo SIGINT y SIGTERM tienen soporte:
process.raise("SIGINT") entrega la señal; el gancho incrementa fired e
imprime el conteo. process.sleep(50) da tiempo al hilo de señal para encolar
el evento antes del siguiente punto de interrupción. Ejecuta localmente para
observar la secuencia 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")
Requiere la CLI o el host de Zolo; ábrelo en el playground o ejecútalo localmente.
Desafío
Añade un segundo on signal SIGINT y verifica que ambos se disparan cuando
process.raise("SIGINT") es llamado. Luego cambia a SIGTERM y confirma que
el primer bloque no interfiere.
Consulta también