Ditch the Try/Catch Desert: Unleash the Oasis of Functional Error Handling with Either

Oswaldo Oliveira
3 min readDec 19, 2023

--

Hey TypeScript warriors, gather around! Today, we’re leaving the dusty plains of traditional try/catch behind and venturing into the lush oasis of functional error handling. We’ll trade those tumbleweeds of exceptions for the elegant power of the Either type, transforming your code from a spaghetti western into a serene zen garden.

Try/Catch: The Gritty Gunslinger

Let’s face it, traditional try/catch feels like a wild west saloon brawl. You wrestle with cryptic errors, dodge unexpected bullets, and pray you haven’t missed a lurking gremlin in the code. Here’s a classic gunslinger scenario:

try {
const treasure = digForGold(mineEntrance);
if (!treasure) {
throw new EmptyMineError();
}
console.log("I struck gold!");
} catch (error) {
console.error(`Darn! ${error}`);
}

It works, but it’s messy and unpredictable. Errors lurk in shadows, and logic gets tangled in conditional spaghetti.

Enter the Either: A Masterful Samurai

Functional programming offers a new path, not with six-shooters but with the wisdom of samurai. The Either type acts as a skilled combatant, wielding both success (Right) and errors (Left) with grace and clarity. Imagine them as two sides of a polished katana:

class Left<E> {
constructor(readonly value: E) {}
isLeft(): this is Left<E> {
return true;
}
isRight(): this is Right<never> {
return false;
}
}

class Right<A> {
constructor(readonly value: A) {}
isLeft(): this is Left<never> {
return false;
}
isRight(): this is Right<A> {
return true;
}
}

type Either<E, A> = Left<E> | Right<A>;

Rewriting the Gunslinger Tale: A Code Haiku

With the Either in hand, our gunslinger transforms into a haiku master:

const result: Either<Error, Data> = riskyOperation();

if (result.isRight()) {
console.log(result.value);
} else {
console.error(result.value);
}

Beautiful, isn’t it? Every step is crystal clear. We pattern-match against the Either, handling success and errors distinctly. Errors become tangible values, not shadowy bullets.

The Oasis Blooms: Benefits of Functional Elegance

This is just the beginning of our journey. Here’s why the functional approach reigns supreme:

  • Predictability: See the future! The Either’s type signature reveals what a function can return, guiding you on your coding path.
  • Readability: No more squinting at cryptic errors. Functional code flows like a serene stream, clear and understandable.
  • Testability: Errors become predictable guests, easily invited and analyzed for thorough testing.
  • Composability: Chain functions like building blocks, creating modular and reusable code fortresses.

Beyond the Basics: Deeper into the Oasis

Our oasis offers abundant resources to quench your coding thirst:

  • Advanced Patterns: Master techniques like Maybe and EitherT for nuanced error handling. Imagine these as specialized katanas, dealing with subtle threats with precision.
  • Function Fusion: Chain functions like graceful sword strikes. Use map, flatMap, and filter to navigate the error landscape with elegance.
  • Community Harmony: Share wisdom with fellow travelers! Explore libraries like fp-ts and Ramda, join online discussions, and learn from the masters.

Remember, functional error handling is not just a technique, it’s a philosophy. By embracing clarity, composability, and immutability, you craft code that shines like a polished blade. So, sharpen your functional sword, TypeScript warriors, and conquer the code desert with the power of the Either!

--

--

Oswaldo Oliveira

Software engineer with 2+ years of experience in microservices for large telecom companies. Passionate about creating reliable and scalable architectures.