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

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...

Coinbase x402 is great option for paymant per request!

  🚀 What is Coinbase x402? x402 is a new open payment protocol built by Coinbase that revives the long-forgotten HTTP 402 “Payment Required” status and turns it into a modern, internet-native payment layer . Using stablecoins (such as USDC ) directly over HTTP, x402 allows services: APIs, websites, or digital content platforms to charge per request. At the same time,  clients (including AI agents and automated systems ) can pay programmatically , without accounts, subscriptions, or human interaction. In simple terms: request → pay → get response , all at the protocol level. How It Works (Simplified) A client requests a protected resource (API, data, article, service). The server responds with HTTP 402 Payment Required , including payment instructions. The client (app or AI agent) generates a payment transaction using its wallet. The client resends the request with payment details included in HTTP headers. The server verifies the payment and immediately ret...

Hello World: Meet the Author – A Developer's Introduction

  I’m Mykola Kolomiiets, a passionate and experienced Solution Architect dedicated to blending technical innovation with practical business strategies. With over a decade of experience in the tech industry, I specialize in designing scalable, secure, and adaptive software solutions that align with both immediate project requirements and long-term business goals. My Journey For more than six years, I have been at the forefront of leading projects across various domains, transforming business ideas into fully realized solutions. This journey has involved crafting detailed system architectures, comprehensive designs, and building well-structured teams tailored to each project’s unique needs. One of my proudest accomplishments has been the development of educational programs for development and security teams. These programs are designed to empower professionals, enabling them to grow, adopt best practices, and transition from developers into effective team leaders. Witnessing this tra...