An exception in C# is an unwanted or unexpected event that occurs at runtime. It affects the normal flow of the program. Common exceptions include invalid input, divide-by-zero operations, or accessing invalid array indices. C# provides a powerful exception-handling mechanism to successfully recover from these runtime issues and keep the program running smoothly.
Example: Divide By Zero Exception. This example shows the occurrence of the exception during divide by zero operation.
C#
// C# program to illustrate the exception
using System;
class Geeks {
static void Main(string[] args)
{
// Declaring two integer values
int A = 12;
int B = 0;
// divide by zero error
int C = A / B;
Console.Write("Value of C is " + C);
}
}
Output:
Unhandled Exception:
System.DivideByZeroException: Attempted to divide by zero.
at Geeks.Main (System.String[] args) [0x00005] in <78d30a8ae7274e28ac400780dfde8dc7>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.DivideByZeroException: Attempted to divide by zero.
at Geeks.Main (System.String[] args) [0x00005] in <78d30a8ae7274e28ac400780dfde8dc7>:0
Exception Handling in C#
C# provides try-catch and finally blocks to handle exceptions effectively.
Syntax:
try
{
// Code that may throw an exception
}
catch (ExceptionType ex)
{
// Handle the exception
}
finally
{
// Cleanup code (optional)
}
Example:
C#
using System;
class Geeks
{
static void Main()
{
try
{
int A = 10;
int B = 0;
// Attempting to divide by zero
int res = A / B;
Console.WriteLine("Result: " + res);
}
catch (DivideByZeroException ex)
{
Console.WriteLine("Error: " + ex.Message);
}
finally
{
Console.WriteLine("Execution completed.");
}
}
}
OutputError: Attempted to divide by zero.
Execution completed.
C# Exception Hierarchy
In C#, all exceptions are derived from the base class Exception, which is further divided into two main categories:
- SystemException: This is the base class for exceptions generated by the Common Language Runtime (CLR) or system-related errors. Examples include DivideByZeroException and NullReferenceException.
- ApplicationException: This is the base class for exceptions related to the application. Developers can create custom exception types by inheriting from ApplicationException.
All exception classes in C# are ultimately derived from the Exception class, with SystemException containing standard system-related exceptions and ApplicationException allowing users to define their own specific exceptions. To know the difference between these, refer: System Level Exception Vs Application Level Exception in C#

Difference Between Errors and Exception
Features
| Errors
| Exceptions
|
---|
Definition
| Errors are unexpected issues that may arise during computer program execution.
| Exceptions are unexpected events that may arise during run-time.
|
---|
Handling
| Errors cannot be handled by the Program.
| Exceptions can be handled using try-catch mechanisms.
|
---|
Relationship
| All Errors are exceptions.
| All exceptions are not errors.
|
---|
C# Exception Classes
There are different kinds of exceptions which can be generated in C# program:
1. Divide By Zero exception: It occurs when the user attempts to divide by zero.
Example:
int result = 10 / 0; // Throws DivideByZeroException
2. NullReferenceException: Occurs when referencing a null object.
Example:
string str = null;
Console.WriteLine(str.Length); // Throws NullReferenceException
3. IndexOutOfRangeException: Thrown when accessing an invalid index in an array.
Example:
int[] arr = {1, 2, 3};
Console.WriteLine(arr[5]); // Throws IndexOutOfRangeException
4. OutOfMemoryException: Occurs when the program exceeds available memory.
5. StackOverflowException: Caused by infinite recursion.
Example:
void Recursive() => Recursive();
Recursive(); // Throws StackOverflowException
Properties of the Exception Class
The Exception class has many properties which help the user to get information about the exception during the exception.
- Data: This property helps to get the information about the arbitrary data which is held by the property in the key-value pairs.
- TargetSite: This property helps to get the name of the method where the exception will throw.
- Message: This property helps to provide the details about the main cause of the exception occurrence.
- HelpLink: This property helps to hold the URL for a particular exception.
- StackTrace: This property helps to provide the information about where the error occurred.
- InnerException: This property helps to provide the information about the series of exceptions that might have occurred.
Important Points:
- Use Specific Exceptions: Catch specific exceptions rather than a general Exception.
catch (DivideByZeroException ex) { /* Handle divide-by-zero */ }
- Avoid Empty Catch Blocks: Always log or handle exceptions meaningfully.
- Use Finally for Cleanup: Use the finally block to release resources like files or database connections.
- Do Not Overuse Exceptions: Use exceptions only for exceptional cases, not for control flow.
Similar Reads
Exception Handling in C#
An exception is defined as an event that occurs during the execution of a program that is unexpected by the program code. The actions to be performed in case of occurrence of an exception is not known to the program. In such a case, we create an exception object and call the exception handler code.
6 min read
C# | Array IndexOutofRange Exception
C# supports the creation and manipulation of arrays, as a data structure. The index of an array is an integer value that has value in the interval [0, n-1], where n is the size of the array. If a request for a negative or an index greater than or equal to the size of the array is made, then the C# t
3 min read
C# | IndexOfAny() Method
In C#, IndexOfAny() method is a String Method. It is used to search the specified character index present in the string which will be the first occurrence from start index. It returns index as an integer value. This method can be overloaded by changing the number of arguments passed to it. IndexOfAn
7 min read
C# | EndsWith() Method
In C#, the EndsWith() is a string method used to check whether the ending of the current string instance matches a specified string. If it matches, it returns true; otherwise, it returns false. Using the foreach loop, we can check multiple strings. This method supports overloading by passing differe
4 min read
C# System Level Exception vs Application Level Exception
In C#, exceptions are categorized into two main types based on their origin and usage, which are System-level exceptions and Application-level exceptions. Understanding the difference between these two helps in managing exceptions properly and choosing the right exception-handling approach. System L
3 min read
C# - Break statement
In C#, the break statement is used to terminate a loop(for, if, while, etc.) or a switch statement on a certain condition. And after terminating the controls will pass to the statements that present after the break statement, if available. If the break statement exists in the nested loop, then it wi
4 min read
How C# Code Gets Compiled and Executed?
C# is a general-purpose, strongly typed, lexically scoped, functional, object-oriented, and component-oriented programming language. In this article, we are going to learn how C# code gets compiled and executed. Step-by-step process of C# code compilation: Step 1: Write a C# code. Step 2: Compile th
4 min read
How to Use Multiple Catch Clauses in C#?
In C#, the main purpose of a catch block is to handle exceptions raised in the try block. A catch block is executed only when an exception occurs in the program. We can use multiple catch blocks with a single try block to handle different types of exceptions. Each catch block is designed to handle a
3 min read
C# - Nesting of Try and Catch Blocks
In C#, the nesting of the try-and-catch block is allowed. The nesting of a try block means one try block can be nested into another try block. The various programmer uses the outer try block to handle serious exceptions, whereas the inner block for handling normal exceptions. Example 1: Handling Div
3 min read
C# | Char.IsSurrogatePair(String, Int32) Method
This method is used to indicates whether two adjacent Char objects at a specified position in a string form a surrogate pair or not. Syntax: public static bool IsSurrogatePair (string s, int index); Parameters: s: It is a String. index: It is the starting position of the pair of characters to evalua
4 min read