An exception is an unexpected event that occurs during program execution. For example,
int divideByZero = 7 / 0;
The above code causes an exception as it is not possible to divide a number by 0.
Exceptions abnormally terminate the flow of the program instructions, we need to handle those exceptions. Responding or handling exceptions is called Exception Handling.
C# Exception Handling Blocks
C# provides built-in blocks to handle exceptions. They are: try..catch and finally. 
try…catch block
The try..catch block is used to handle exceptions in C#. Here's the syntax of try...catch block:
try
{
    // code that may raise an exception 
}
catch (Exception e)
{
    // code that handles the exception
}
Here, we place the code that might generate an exception inside the try block. The try block then throws the exception to the catch block which handles the raised exception. For example, 
try
{
    int num = 0;
    // code that may raise an exception 
    int divideByZero = 7 / num;
}
catch (Exception e)
{
    Console.WriteLine("Exception has occurred");
}
Here, we are trying to divide a number by zero. In this case, an exception occurs. Hence, we have enclosed this code inside the try block. The catch block notifies the user about the occurred exception. 
Example: Exception Handling Using try…catch
using System;
class Program
{
    static void Main()
    {
        string[] colors = { "Red", "Blue", "Green" };
        try
        {
            // code that may raise an exception 
            Console.WriteLine(colors[5]);
        }
        catch (IndexOutOfRangeException e)
        {
            Console.WriteLine("An exception occurred: " + e.Message);
        }
    }
}
Output
An exception occurred: Index was outside the bounds of the array.
In the above example, notice the code,
Console.WriteLine(colors[5]);
Since there is no element at index 5 of the colors array, the above code raises an exception. So we have enclosed this code in the try block.
When the program encounters this code, IndexOutOfRangeException occurs. And, the exception is caught by the catch block and executes the code inside the catch block.
Notice the code,
catch (IndexOutOfRangeException e)
{
    Console.WriteLine("An exception occurred: " + e.Message);
}
Here, catch is taking an instance of the IndexOutOfRangeException class. And inside the block we have used the Message property of this class to display a message. 
Note: If you want to learn more about the Exception class methods and properties visit here.
try…catch…finally block
We can also use finally block with try and catch block. The finally block is always executed whether there is an exception or not. 
The syntax of the try…catch…finally block is: 
try
{
    // code that may raise an exception
}
catch (Exception e)
{
    // code that handles the exception 
}
finally
{
    // this code is always executed
}
	We can see in the above image that the finally block is executed in both cases. The finally block is executed: 
- after 
tryandcatchblock - when exception has occurred - after 
tryblock - when exception doesn't occur 
The try..catch..finally block can be collectively used to handle exceptions. 
Now let's look at an example of exception handling using try…catch…finally. 
Example: Exception Handling Using try…catch…finally block
using System;
public class Program
{
    static void Main()
    {
        // take first int input from user
        Console.WriteLine("Enter first number:");
        int firstNumber = int.Parse(Console.ReadLine());
        // take second int input from user
        Console.WriteLine("Enter second number:");
        int secondNumber = int.Parse(Console.ReadLine());
        try
        {
            // code that may raise raise an exception 
            int divisionResult = firstNumber / secondNumber;
            Console.WriteLine("Division of two numbers is: " + divisionResult);
        }
        // this catch block gets executed only when an exception is raised
        catch (Exception e)
        {
            Console.WriteLine("An exception occurred: " + e.Message);
        }
        finally
        {
            // this code is always executed whether of exception occurred or not 
            Console.WriteLine("Sum of two numbers is: " + (firstNumber + secondNumber));
        }
    }
}
Output
Enter first number: 8 Enter second number: 0 An exception occurred: Attempted to divide by zero. Sum of two numbers is: 8
In the above example, we have tried to perform division and addition operations to two int input values using try...catch…finally. 
Notice the code,
try
{
    // code that may raise raise an exception 
    int divisionResult = firstNumber / secondNumber;
}
Here, we have enclosed the code that performs division operation inside try because this code may raise the DivideByZeroException exception.    
There are two cases in this program:
Case I - When exception occurs in try, the catch block is executed followed by the finally block.  
Case II - The finally block is directly executed after the try block if an exception doesn't occur.  For example, if we enter 9 and 2, exception doesn't occur in the try block and we get the following output:
// Output when exception doesn't occur 
Enter first number:
9
Enter second number:
2
Division of two numbers is: 4
Sum of two numbers is: 11
Frequently Asked Questions
In C#, a try…catch block inside another try…catch block is called nested try…catch. For example,
using System;
class Program
{
    static void Main()
    {
        int divisor = 0;
        try
        {
            // nested try block 
            try
            {
                int divideByZero = 6 / divisor;
            }
            // inner catch block
            catch (IndexOutOfRangeException e)
            {
                Console.WriteLine("Inner catch is executed. " + e.Message);
            }
        }
        // outer catch block
        catch (DivideByZeroException e)
        {
            Console.WriteLine("Outer catch block is executed. " + e.Message);
        }
    }
}
Output
Outer catch block is executed. Attempted to divide by zero.
In the above example, we have used a try-catch block inside another try-catch block.
The inner catch block gets executed when the raised exception type is IndexOutOfRangeException. However, in our program, DivideByZeroException is raised in the outer try block so the outer catch block gets executed.
The catch block without exception class is called generic catch block. For example,
using System;
class Program
{
    static void Main()
    {
        int[] numbers = { 1, 2, 3 };
        try
        {
            // access element present at 5th index position
            Console.WriteLine(numbers[5]);
        }
        // generic catch block 
        catch
        {
            Console.WriteLine("Some exception occurred");
        }
    }
}
Output
Some exception occurred
Here, we have used a generic catch block with the try block. 
Note: The generic catch block can catch and handle any type of exception thrown by the try block.
In C#, we can use multiple catch blocks to handle exceptions. If non-generic catch blocks don't handle the exception, then generic catch blocks are executed. For example,
using System;
class Program
{
    static void Main()
    {
        int[] numbers = { 1, 0, 3, 4 };
        try
        {
            // code that may raise an exception
            int divide = numbers[2] / numbers[1];
        }
        // if IndexOutofRangeException occurs, the following block is executed 
        catch (IndexOutOfRangeException e)
        {
            Console.WriteLine(e.Message);
        }
        // if the above catch block doesn't handle the exception,
        // this block is executed 
        catch(Exception e)
        {
            Console.WriteLine("Some exception occurred");
        }
    }
}
Output
Some exception occurred
Here, inside the try block, the IndexOutofRangeException exception is not raised hence the corresponding catch block doesn't handle the exception.