Pular para o conteúdo

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.

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")

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.

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")

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.

Buscar no Zolo

9 resultados

enespt-br