Skip to content
Docs menu / Sandboxing

Sandboxing

Effect.sandbox exposes the complete failure Cause in the typed error channel:

Effect<A, E, R> -> Effect<A, Cause<E>, R>

Unlike an ordinary typed error, a Cause<E> can contain typed failures, defects, interruptions, or several reasons at once. Causes are flat: inspect the readonly reasons array and use the reason guards from the Cause module.

Example (Inspecting a Sandboxed Cause)

import { Cause, Effect } from "effect"
const sandboxed = Effect.fail("invalid input").pipe(Effect.sandbox)
const program = sandboxed.pipe(
Effect.catch((cause) => {
const failure = cause.reasons.find(Cause.isFailReason)
return failure === undefined
? Effect.fail(cause)
: Effect.succeed(`Recovered from: ${failure.error}`)
}),
)
Effect.runSync(program) // => "Recovered from: invalid input"

When a sandboxed effect has not otherwise recovered, convert its error channel back to the original failure model with Effect.catch(Effect.failCause):

import { Effect, Exit } from "effect"
const sandboxed = Effect.fail("invalid input").pipe(Effect.sandbox)
const restored = sandboxed.pipe(Effect.catch(Effect.failCause))
Effect.runSyncExit(restored) // => Exit.fail("invalid input")

For one recovery step, Effect.catchCause is usually simpler because it provides the same Cause directly without changing the error type first.