C# > Advanced C# > Exception Handling > try-catch-finally
Using Exception Filters
This code snippet showcases exception filters, a feature in C# that allows you to conditionally catch exceptions based on certain criteria. This provides a more granular way to handle exceptions and avoid unnecessary catch blocks.
Code Structure
The catch block includes a when clause, which acts as an exception filter. The code in the catch block will only be executed if the exception type matches (ArgumentException in this case) and the condition in the when clause is true (ex.ParamName == "parameterName"). This allows you to handle specific cases of an exception type differently. In this example, we throw an ArgumentException. The first catch block catches the exception only if the ParamName property is equal to "parameterName". The second catch block catches other ArgumentException instances that don't meet the first condition.
using System;
public class Example
{
public static void Main(string[] args)
{
try
{
// Simulate an error
throw new ArgumentException("Invalid argument", "parameterName");
}
catch (ArgumentException ex) when (ex.ParamName == "parameterName")
{
// Catch the exception only if the ParamName is "parameterName"
Console.WriteLine("Caught ArgumentException for parameterName: " + ex.Message);
}
catch (ArgumentException ex)
{
// Catch other ArgumentExceptions
Console.WriteLine("Caught a different ArgumentException: " + ex.Message);
}
catch (Exception ex)
{
// Handle any other exceptions
Console.WriteLine("Caught a general exception: " + ex.Message);
}
finally
{
Console.WriteLine("Finally block executed.");
}
}
}
Concepts Behind the Snippet
Exception filters enhance exception handling by allowing you to selectively catch exceptions based on their properties or other runtime conditions. This reduces the need for complex logic within the catch block and promotes cleaner, more readable code. Exception filters prevent a catch block from executing when it is not the correct handler for a caught exception.
Real-Life Use Case
Imagine a scenario where you are processing data from different sources. Each source might throw a custom exception with a property indicating the source's ID. You can use exception filters to catch exceptions specific to each source and handle them accordingly. Or, you could have different severity levels of exceptions and only handle exceptions above a certain threshold within a particular catch block. Exception filters can also log details about the exception or specific data values associated with it.
Best Practices
when clause, as it can impact performance.catch blocks.
Interview Tip
Be prepared to explain the purpose of exception filters and how they differ from traditional catch blocks. Be ready to discuss scenarios where exception filters can simplify exception handling logic. Emphasize that exception filters allow for more precise control over which catch block handles a particular exception instance.
When to Use Them
Use exception filters when you need to handle different cases of the same exception type differently. They are particularly useful when the handling logic depends on the properties of the exception object or other runtime conditions.
Alternatives
Without exception filters, you would need to put the filtering logic inside the catch block itself. This can make the code more complex and less readable. Exception filters are a cleaner and more efficient way to achieve the same result. Another alternative might be creating more specific exception classes themselves, but that can quickly lead to an explosion of classes in the project.
Pros
catch blocks.
Cons
FAQ
-
Can I have multiple
whenclauses in a singlecatchblock?
No, you can only have onewhenclause percatchblock. If you need to handle multiple conditions, you can use multiplecatchblocks with differentwhenclauses. -
What happens if the
whenclause throws an exception?
If thewhenclause throws an exception, the filter is considered to have evaluated to false, and thecatchblock is not executed. The exception is then propagated up the call stack. -
Is the
whenclause evaluated before or after the exception type check?
The exception type check happens first. If the exception type doesn't match thecatchblock's exception type, then thewhenclause is never evaluated.