Skip to main content

Hints and Hacks: Minimize using Exceptions .NET

Microsoft recommends against using exceptions for regular program flow, as they are slower than other control flow methods. Exceptions should be reserved for handling rare or unexpected situations, not the usual flow of the program. (Microsoft Docs: Best Practices for Exceptions - .NET | Microsoft Learn)

A more efficient and elegant alternative is to use a Result object, which effectively represents the outcome of an operation. This approach communicates the result clearly without relying on exceptions, offering simplicity and clarity.

Why use the Result object?

  • Improved expressiveness: The function signature clearly indicates possible outcomes, making the code more self-explanatory.
  • Better performance: This method avoids the performance overhead of throwing and catching exceptions, especially in scenarios where errors are anticipated.
  • Consistent error handling: Errors are turned into values that can be passed, modified, or logged easily, creating a more predictable and uniform error-handling process.
  • Customizable: The Result class can be easily extended to include additional information, validation errors, or other contextual data.

Example code

Exceptions style

public async Task<Project> GetProject(int projectKey)
{
    var project = await _projectRepository.Get(projectKey);

    if (project is null)
    {
       throw ProjectNotFoundException();
    }

    return project;
}

Result Style

public async Task<Result<Project>> GetProject(int projectKey)
{
    var project = await _projectRepository.Get(projectKey);

    if (project is null)
    {
       return ResultBuilder.WithNotFoundError<Project>(projectKey);
    }

    return ResultBuilder.WithSuccess<Project>(project);
}

Comments

Popular posts from this blog

Why Microsoft Azure Well-Architected Framework Can Improve Architecture

Small and medium-sized businesses often face a common challenge: the absence of experienced cloud engineers. Due to limited resources, teams typically choose the quickest path—getting things done in the easiest, fastest way. Unfortunately, this approach often leads to solutions that aren't secure, cost too much, and become nearly impossible to extend or manage effectively. Recognizing this critical challenge, Microsoft Azure has developed the Well-Architected Framework. This comprehensive set of guidelines and best practices helps businesses assess their existing solutions and guides them toward building robust, secure, cost-effective, and manageable cloud infrastructures from the start. The Azure Well-Architected Framework is structured around five essential pillars: Cost Optimization : Ensuring that cloud resources are used efficiently and effectively, reducing unnecessary expenses. Operational Excellence : Focusing on the ability to run and monitor systems effectively, ensuring ...

"Dushnylo" Series: Monolith First approach.

I keep hearing, “You MUST start with a monolith.” Every new project? Always? When I hear that, two thoughts immediately come to mind:      1️⃣ “It depends.” You can’t just blindly say every project must start as a monolith.      2️⃣ My inner Dushnylo whispers: “Time to make a post about this.” So, here’s my take: I disagree. Not only do I disagree, but I believe the most critical and dangerous part of system design is analyzing and understanding business needs before making architectural decisions. Why? Simple. Imagine you’re building a streaming platform that processes massive amounts of data, handles notifications, and integrates with third-party services. Does this sound like something you’d build as a pure monolith? Of course not. But I do agree on one thing—you have to start somewhere. That starting point could be a simple core application —yes, it might look like a monolith at first. But you’re not designing the entire system as a monolith. ...

Microsoft Azure Well-Architected Framework - Maturity models

The Azure Well-Architected Framework has always been a great way to assess and review workloads. But with the recent updates—especially the introduction of maturity levels —it’s becoming much more than just a checklist. 💡 It’s evolving into a concept. Not only can teams review their architecture, but they can now score, track progress, and continuously improve . The maturity model provides clear stages—from establishing a solid foundation to achieving future-proof agility—making it easier to understand where you are today and where you should aim tomorrow. Why is this important? ✅ It transforms reviews into a roadmap for growth ✅ It allows measurable scoring of architecture maturity ✅ It pushes teams to focus not only on compliance, but also on resilience, agility, and future-readiness Each update makes the Azure Well-Architected Framework better and stronger —helping organizations align technology decisions with long-term business success. 👉 In my view, this is the right dire...