C# Tutorial

C# Tutorial C# First Application C# Variables C# Data Types C# Operators C# Keywords

C# Control Statement

C# If Statements C# Switch Statements C# for Loop C# While Loop C# do While loop C# Jump Statements C# Function C# functions with out variable

C# Arrays

C# Arrays

C# Function

C# Function call by value C# Call by reference C# Passing array to function C# Multidimensional Arrays C# Jagged Arrays C# Params C# Array Class C# Command Line Arguments

C# Object Class

C# Object and Classes C# Constructors C# Destructor C# this Keyword C# static field C# static class C# Static Constructor C# Structs C# enum C# Properties

C# Inheritance

C# Inheritance C# Multilevel Inheritance C# Aggregation C# Member overloading C# Method Overriding C# Base

C# Polymorphism

C# Polymorphism C# Sealed

C# Abstraction

C# Abstraction C# Interface

C# Namespace

C# Namespace C# Access Modifiers C# Encapsulation

C# Strings

C# String

C# Misc

C# Design Patterns Dictionary in C# Boxing and Unboxing in C# Ref and Out in C# Serialization in C# Dispose and Finalize in C# CONSOLE LOG IN C# Get File extension in C# Insert query in c# Difference Between List and Dictionary in C# Getters and Setters in C# Extension Methods in C# Insert query in c# CONSOLE LOG IN C# Get File extension in C# Random.NextDouble() Method in C# Binary Search in C# Difference between Delegates and Interfaces in C# Double.IsFinite() Method in C# Index Constructor in C# Abstraction in C# Basic OOPS Concepts In C# Queue.CopyTo() Method in C# single.compareto() method in C# C# Throw Exception in Constructor DECODE IN C# file.setlastwritetimeutc() method in C# Convert Object to List in C# convert.ToSByte(string, IFormatProvider) Method in C# C# Declare Delegate in Interface console.TreatControl C As Input property in C# Copying the queue elements to 1-D Array in C# Array.Constrainedcopy() Method in C# C# in and out Char.IsLetterOrDigit() method in C# Debugging in C# decimal.compare() method in C# Difference between Console.Read and Console.Readline in C# Metadata in C# C# Event Handler Example Default Interface Methods in C# Difference between hashtable and dictionary in C# C# program to implement IDisposable Interface Encapsulation in C# SortedList.IndexOfVaalue(Object) Method in C# Hash Maps in C# How to clear text files in C# How to Convert xls to xlsx in C# Foreach loop in C# FIFO in C# How to handle null exception in C# Type.Is Instance Of Type() Method in C# How to add data into MySQL database using C# How to use angular js in ASP net Csharp decimal.compare() method in Csharp Difference between Console.Read and Console.Readline in Csharp How to Implement Interface in Csharp char.IsUpper() Method in C# Index Of Any() Method in C# Quantifiers in C# C# program to Get Extension of a Given File C# Error Logging C# ENCRIPTION Can we create an object for Abstract Class in C# Console.CursorVisible in C# SortedDictionary Implementation in C# C# Hash Table with Examples Setting the Location of the Label in c# Collections in c# Virtual Keyword in C# Reverse of string in C# String and StringBuilder in C# Encapsulation in C# SortedList.IndexOfVaalue(Object) Method in C# Hash Maps in C# How to clear text files in C# How to Convert xls to xlsx in C# Foreach loop in C# FIFO in C# How to handle null exception in C# Type.Is Instance Of Type() Method in C# How to add data into MySQL database using C# How to use angular js in ASP net Csharp decimal.compare() method in Csharp Difference between Console.Read and Console.Readline in Csharp How to Implement Interface in Csharp char.IsUpper() Method in C# Index Of Any() Method in C# Quantifiers in C# C# program to Get Extension of a Given File Difference between ref and out in C# Singleton Class in C# Const And Readonly In Csharp BinaryReader and BinaryWriter in C# C# Attributes C# Delegates DirectoryInfo Class in C# Export and Import Excel Data in C# File Class in C# FileInfo Class in C# How to Cancel Parallel Operations in C#? Maximum Degree of Parallelism in C# Parallel Foreach Loop in C# Parallel Invoke in C# StreamReader and StreamWriter in C# TextReader and TextWriter in C# AsQueryable() in C# Basic Database Operations Using C# C# Anonymous Methods C# Events C# Generics C# Indexers C# Multidimensional Indexers C# Multithreading C# New Features C# Overloading of Indexers Difference between delegates and events in C# Operator overloading in C# Filter table in C# C# Queue with Examples C# Sortedlist With Examples C# Stack with Examples C# Unsafe Code File Handling in C# HashSet in C# with Examples List Implementation in C# SortedSet in C# with Examples C# in Depth Delegates and Events in C# Finally Block in C# How to Split String in C# Loggers in C# Nullable Types in C# REVERSE A STRING IN C# TYPE CASTING IN C# What is Generics in C# ABSTRACT CLASS IN C# Application of pointer in C# Await in c# READONLY AND CONSTANT IN C# Type safe in C# Types of Variables in c# Use of delegates in c# ABSTRACT CLASS IN C# Application of pointer in C# Await in c# READONLY AND CONSTANT IN C# Type safe in C# Types of Variables in c# Use of delegates in c# ABSTRACT CLASS IN C# Application of pointer in C# Await in c# READONLY AND CONSTANT IN C# Type safe in C# Types of Variables in c# Use of delegates in c# Atomic Methods Thread Safety and Race Conditions in C# Parallel LINQ in C# Design Principles in C# Difference Between Struct And Class In C# Difference between Abstraction and Encapsulation in C# Escape Sequence Characters in C# What is IOC in C# Multiple Catch blocks in C# Appdomain in C# Call back methods in C# Change Datetime format in C# Declare String array in C# Default Access Specifier in c# Foreach in LINQ C# How to compare two lists in C# How to Convert String to Datetime in c# How to get only Date from DateTime in C# Ispostback in asp net C# JSON OBJECT IN C# JSON STRINGIFY IN C# LAMBDA FUNCTION IN C# LINQ Lambda Expression in C# Microservices in C# MSIL IN C# Reference parameter in C# Shadowing(Method hiding) in C# Solid principles in C# Static Members in C# Task run in C# Transaction scope in C# Type Conversion in c# Unit of Work in C# Unit Test Cases in c# User Defined Exception in c# Using Keyword in C# Var Keyword in C# What is gac in C#

How to use multiple catch clause in C#

In this article, you will learn how to use multiple catch clause in C#. But before going to its implementation, you must know about catch block with its syntax.

Handling the exception that was raised in the try block is the primary goal of the catch block. This block will begin to run only when the program raises an exception. The try block in C# allows you to use multiple catch blocks. Different types of exceptions are typically handled by multiple catch blocks, which means that each catch block handles a different exception type. There will be a compile-time error if you use multiple catch blocks for the same kind of an exception because C# does not permit this behavior. Usually, the try block comes before the catch block. The catch blocks are typically checked in the program's chronological order of occurrence. The first catch block gets to work, and the other catch blocks are ignored if the exception type matches the first catch block. In the event that the catch block at the beginning is not appropriate for the type of exception, the compiler will look for the next catch block.

Syntax:

It has the following syntax:

try

{

    // Code that may throw exceptions

}

catch (ExceptionType1 ex)

{

    // Handle ExceptionType1

    // ex contains information about the exception

}

catch (ExceptionType2 ex)

{

    // Handle ExceptionType2

    // ex contains information about the exception

}

catch (Exception ex)

{

    // Handle any other exceptions that are not caught by previous catch blocks

    // ex contains information about the exception

}

finally

{

    // Optional: Code that will always execute, regardless of whether an exception occurred or not

}

Example:

Let us take an example to illustrate how to use multiple catch clause in C#.

using System;

class Program

{

    static void Main(string[] args)

    {

        try

        {

            // Code that may throw exceptions

            int[] numbers = { 1, 2, 3 };

            Console.WriteLine("Dividing by zero...");

            int result = numbers[0] / (numbers[1] - numbers[1]);

            Console.WriteLine("Result: " + result);

        }

        catch (DivideByZeroException ex)

        {

            // Handle DivideByZeroException

            Console.WriteLine("Error: Attempted to divide by zero.");

        }

        catch (IndexOutOfRangeException ex)

        {

            // Handle IndexOutOfRangeException

            Console.WriteLine("Error: Index out of range.");

        }

        catch (Exception ex)

        {

            // Handle any other exceptions that are not caught by previous catch blocks

            Console.WriteLine("An error occurred: " + ex.Message);

        }

        finally

        {

            // Optional: Code that will always execute, regardless of whether an exception occurred or not

            Console.WriteLine("Finally block executed.");

        }

    }

}

Output:

Dividing by zero...

ERROR!

Error: Attempted to divide by zero.

Finally block executed.

Explanation:

  • The code in our try block has the potential to throw exceptions. We are attempting to access an index that is outside of an array's range by dividing by zero in this instance.
  • DivideByZeroException and IndexOutOfRangeException are two of the catch blocks we have to handle various exception types. For the corresponding exception type, each catch block offers particular handling.
  • The catch (Exception ex) block is a catch-all block that deals with any additional exceptions that the preceding catch blocks failed to catch. Together with the exception's message, a generic error message is printed.
  • Whether or not an exception occurred, the finally block prints a message indicating that it has been executed. It is an optional block.

Example 2:

Let us take another example to illustrate how to use multiple catch clause in C#.

using System;

class Program

{

    static void Main(string[] args)

    {

        try

        {

            // Code that may throw exceptions

            WithdrawMoney(200); // Try withdrawing more money than available

        }

        catch (InsufficientFundsException ex)

        {

            // Handle InsufficientFundsException

            Console.WriteLine("Error: " + ex.Message);

        }

        catch (InvalidWithdrawalAmountException ex)

        {

            // Handle InvalidWithdrawalAmountException

            Console.WriteLine("Error: " + ex.Message);

        }

        catch (Exception ex)

        {

            // Handle any other exceptions that are not caught by previous catch blocks

            Console.WriteLine("An error occurred: " + ex.Message);

        }

        finally

        {

            // Optional: Code that will always execute, regardless of whether an exception occurred or not

            Console.WriteLine("Finally block executed.");

        }

    }

    static void WithdrawMoney(double amount)

    {

        double balance = 100;

        if (amount > balance)

        {

            throw new InsufficientFundsException("Insufficient funds to withdraw.");

        }

        else if (amount <= 0)

        {

            throw new InvalidWithdrawalAmountException("Invalid withdrawal amount.");

        }

        else

        {

            balance -= amount;

            Console.WriteLine($"Withdrawal successful. Remaining balance: {balance}");

        }

    }

}

// Custom exception classes

class InsufficientFundsException : Exception

{

    public InsufficientFundsException(string message) : base(message)

    {

    }

}

class InvalidWithdrawalAmountException : Exception

{

    public InvalidWithdrawalAmountException(string message) : base(message)

    {

    }

}

Output:

ERROR!

Error: Insufficient funds to withdraw.

Finally block executed.

Conclusion:

In conclusion, C# offers a strong mechanism for gracefully handling a variety of exception types within a program with multiple catch clauses. Developers can modify their error-handling logic to tackle various exceptional scenarios with ease by categorizing catch blocks according to distinct exception types. By ensuring that exceptions are appropriately caught and handled, this approach improves the overall reliability, maintainability, and readability of code. The final block also permits the execution of cleanup code even without an exception to help with resource management and guarantee consistent program behaviour. Developers can thoughtfully use exception types and try-catch constructs to create resilient applications that handle errors gracefully and improve user experience.