Propagate failures clearly and keep async flows observable instead of silently dropping errors.
Async code fails differently than synchronous code: exceptions can escape the call site, failures can be delivered later, and “missing error handling” can turn into stuck pipelines rather than a stack trace.
This section focuses on a few dependable strategies: represent failures as data when it makes flows clearer, use exceptions deliberately at boundaries, and make sure errors are surfaced where you can log and alert.
You’ll also learn what to watch for in Clojure specifically, like errors inside future and go blocks, and how to keep them from disappearing.