white round stone on white surface

The Error Handling

The developer wrapped every function in try-catch blocks.

“Now nothing can go wrong,” they declared.

The senior developer asked, “If you catch all errors, what throws them?”

And then, “When you handle an error, where does it go?”


What Are We Really Asking?

Error handling reveals something fundamental about how we think about our systems and our role within them. When we reflexively wrap code in try-catch blocks, we’re often responding to anxiety rather than architecture. The question “if you catch all errors, what throws them?” points to a deeper truth: errors aren’t foreign invaders to be repelled at the gates. They’re signals emerging from the system itself, carrying information about mismatches between our assumptions and reality.

The practice of catching everything creates a subtle but profound problem. Each caught exception represents a moment where the system tried to tell us something went wrong. When we catch indiscriminately, we don’t eliminate these moments – we just muffle them. The error still happened. The condition that produced it still exists. We’ve simply chosen to continue as if neither were true.

Consider what happens in a production environment when exceptions are caught but not properly propagated or logged. The system appears healthy. Monitoring shows green. But underneath, errors accumulate like sediment, each one representing a small failure we’ve chosen to ignore. Eventually, these hidden failures manifest in ways that are much harder to diagnose – subtle data corruption, degraded performance, or mysterious state inconsistencies that seem to appear from nowhere.

The second question – “when you handle an error, where does it go?” – challenges us to think about error handling as transformation rather than elimination. An error doesn’t disappear when caught. It converts into something else: a log entry, a metrics increment, a return value, a fallback behavior, or perhaps simply silence. Each of these transformations has consequences. The question asks us to be intentional about what we’re transforming errors into, and whether that transformation serves our system’s actual needs.

True error handling requires discernment. Some errors indicate programming mistakes that should stop execution immediately. Others represent expected edge cases that systems should handle gracefully. Still others are symptoms of systemic issues that need escalation and investigation. Catching everything equally means treating fundamentally different situations as if they were the same.

The wisdom in this koan lies not in a prescription – “always catch” or “never catch” – but in an invitation to examine our motivations. Are we handling errors to make our systems more robust, or to make ourselves feel more in control? Do our try-catch blocks help failures surface in useful ways, or do they create what site reliability engineers call “silent failures” – the most dangerous kind?

When we ask “what throws them?”, we’re really asking: what is our system trying to tell us? And when we ask “where does it go?”, we’re examining whether our handling helps that message reach the people who need to hear it, or simply stops it from being heard at all.