In C#, you can catch multiple exceptions in a single catch block using exception filters (introduced in C# 6.0) or by combining separate catch blocks. Here’s how to handle both scenarios:
1. Using Exception Filters (C# 6.0+)
Use the when keyword to filter exceptions in a single catch block.
This preserves the original stack trace and avoids catching unrelated exceptions.
try
{
    // Code that may throw exceptions
}
catch (Exception ex) when (ex is FormatException || ex is OverflowException)
{
    // Handle FormatException or OverflowException here
    Console.WriteLine($"Error: {ex.GetType().Name}");
}
Key Notes:
- The 
whenclause acts as a filter for thecatchblock. - You can check for multiple exception types (e.g., 
FormatException,OverflowException). - The 
exvariable is of typeException, so cast it if you need specific properties: 
  if (ex is FormatException formatEx)
  {
      Console.WriteLine($"Invalid format: {formatEx.Message}");
  }
2. Separate catch Blocks (Legacy Approach)
For older C# versions (< 6.0), use separate catch blocks and reuse logic via a helper method.
try
{
    // Code that may throw exceptions
}
catch (FormatException ex)
{
    HandleError(ex);
}
catch (OverflowException ex)
{
    HandleError(ex);
}
// Shared error handler
void HandleError(Exception ex)
{
    Console.WriteLine($"Error: {ex.GetType().Name}");
}
3. Catching a Common Base Exception
If the exceptions share a common base type (e.g., ArgumentException), catch the base type:
try
{
    // Code that throws ArgumentNullException or ArgumentOutOfRangeException
}
catch (ArgumentException ex)
{
    // Handle all ArgumentException-derived exceptions
    Console.WriteLine($"Argument error: {ex.ParamName}");
}
4. Combining Both Approaches
For complex scenarios, mix when filters and base exceptions:
try
{
    // Code that throws exceptions
}
catch (IOException ex) when (ex is FileNotFoundException || ex is DirectoryNotFoundException)
{
    // Handle specific IO exceptions
}
catch (Exception ex)
{
    // Fallback for all other exceptions
}
Key Considerations
- Order Matters: Place more specific 
catchblocks before general ones (e.g.,FileNotFoundExceptionbeforeIOException). - Avoid Catching 
ExceptionBroadly: Only catch exceptions you can handle meaningfully. - Performance: Exception filters (with 
when) are evaluated when the exception is thrown, not when caught. 
Example: Parsing User Input
try
{
    int num = int.Parse(userInput); // Throws FormatException or OverflowException
}
catch (Exception ex) when (ex is FormatException || ex is OverflowException)
{
    Console.WriteLine("Invalid integer format or value too large/small.");
}
Summary
| Approach | Use Case | Version Support | 
|---|---|---|
when Filter | Clean, single-block handling for C# 6.0+ | C# 6.0+ | 
Separate catch Blocks | Legacy code or non-shared logic | All versions | 
| Base Exception | Group related exceptions | All versions | 
Use when filters for modern code to keep your error handling concise and maintainable!