Exception Handling in ASP.NET Core 8

Need for Global Exception Handling

When an exceptional situation arises, like a runtime error or an unforeseen condition, it disrupts the regular flow of a program. In such cases, it becomes essential to communicate the application's state to users and provide them with appropriate messages. In ASP.NET Core, there are several approaches available to handle exceptions within a system. These mechanisms allow developers to detect, manage, and recover from errors systematically, ensuring the software's stability and enhancing the overall user experience.

Different Ways To Handle Exceptions In ASP.NET Core
 

1. Try-Catch Blocks

This is one approach to placing code inside try-catch blocks that allows you to catch and handle exceptions at a specific location in your code.

Here is an example of a Try-Catch block.

Try-Catch Blocks

Writing try-catch blocks throughout the code to handle exceptions can lead to code scattering. This means that exception-handling logic is spread across various sections of the codebase, making it harder to maintain and understand.

2. Exception Filters

Exception Filters

Exception Handling Attributes are applied at the controller or action level, providing handling specific to that particular part of the application. However, this can result in a lack of global coverage.

3. Global Exceptions Handling and Exception Middlewares

  • .NET 8 introduces an IExceptionHandler a new interface for handling exceptions. It allows us to implement different exception handlers for different use cases in our system in a more elegant way.
  • It overcomes the two above problems that we discussed and helps us to globally manage exceptions.
  • IExceptionHandler, this interface has only one method called TryHandleAsync and this method tries to find the error inside the asp.net core HTTP pipeline.
  • TryHandleAsync method returns true when the exception is successfully handled and returns false Indicating that the handler couldn't or didn't handle the exception.

Here is an example of implementing a global exception handler.

Exception filters can be applied globally or to specific actions or controllers, allowing for more granular control over exception handling.

Here is an example of an Exception filter.

Exception handling

.NET 8 allows us to register our global handler by using AddExceptionHandler() in a dependency injection container and UseExceptionHandler() to request the register exception handlers.

UseExceptionHandler

You can register multiple exception handlers based on specific use cases or for specific HTTP errors and register them like above.

Conclusion

Handling exceptions globally gives more control and readability to our code base, which is easy to manage in larger projects and it’s best practice to handle exceptions globally.

Note. Exceptions for exceptional situations and throwing exceptions are also extremely expensive when you nested structure. Exceptions for unexpected errors, should not be used for situations that are expected or can be handled through normal control flow.

Focus on the expected, Don't plan for every possible unlikely scenario.