try / catch

Evaluates a body; on failure the rendered message binds to the catch name and the handler's value is the result.

try body catch name => handler evaluates the body; if evaluation fails — a builtin error, an error() call, a cycle, or a propagated field error — the rendered message binds to the catch name (a utf8) and the handler's value is the result. Both sides accept a { ... } block.

wcl
rate    = try parse_rate(raw) catch m => 1.0
summary = try {
  let r = risky()
  format("ok: {}", r)
} catch msg {
  format("failed: {}", msg)
}

Catches everything

try makes any evaluation failure recoverable, including cycles and upstream field errors — use it where a fallback is meaningful, not to paper over schema mistakes (wcl check still reports those).