Saltar al contenido

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.

03-on-panic.zolo
Playground
// 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.

04-on-signal.zolo
Playground
// 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.

Buscar en Zolo

9 resultados

enespt-br