C# Exception Handling

Introduction to C# Exception Handling

C# में run time errors को exceptions के माध्यम से represent किया जाता है। यानी की C# में run time errors का representation exceptions है।

आसान शब्दों में कहा जाए तो C# में अलग अलग तरह की run time errors को categories किया गया है और उन्हें exceptions का नाम दिया गया है।

Exceptions ऐसे code द्वारा throw (create) की जाती है जिसमें run time errors आती है और ऐसे code द्वारा catch (handle) की जाती है जो उस error को सुधार सके।

C# में सभी exceptions classes होती है। ये classes System.Exception class से derived होती है। इस class में ऐसी properties available होती है जिनके माध्यम से exception के बारे में विस्तृत जानकारी प्राप्त की जा सकती है।

C# में available exception classes की list निचे दी जा रही है।

  • System.IO.IOException – यह class सभी I/O errors को represent करती है।
  • System.IndexOutOfRangeException – यह class उन errors को represent करती है जो array की index out of range होने से generate होती है।
  • System.ArrayTypeMismatchException – यह class उन errors को represent करती है जो किसी type के array के type से mismatch होने पर generate होती है।
  • System.NullReferenceException – यह class उन errors को represent करती है जो null object को point करने से generate होती है।
  • System.DivideByZeroException – यह class उन errors को represent करती है जो किसी number को zero से divide करने पर generate होती है।
  • System.InvalidCastException – यह class उन errors को represent करती है जो invalid type casting की वजह से generate होती है।
  • System.OutOfMemoryException – यह class उन errors को represent करती है जो memory की कमी के कारण generate होती है।
  • System.StackOverflowException – यह class stack overflow होने के कारण generate होने वाली errors को represent करती है।
  • System.InvalidOperationException – यह class invalid argument के अलावा किसी दूसरे reason से method call fail होने वाली errors को represent करती है।
  • System.ArgumentException – यह class उन errors को represent करती है जो किसी method को गलत argument pass करने की वजह से generate होती है।
  • System.ArgumentNullException – यह class उन errors को represent करती है जो argument के रूप में null pass करने से generate होती है।
  • System.ArgumentOutOfRangeException – यह class उन errors को represent करती है जो out of range arguments pass करने की वजह से generate होती है।
  • System.AccessVoilationException – यह class उन errors को represent करती है जो protected members को inherit करने की वजह से generate होती है।

Exceptions कोई error आने पर CLR (Common Language Runtime) द्वारा automatically throw की जाती है या फिर exception को programmer स्वयं create करके explicitly भी throw कर सकता है।

Handling Exceptions in C#

C# में exceptions को handle करने के लिए try, catch और finally blocks use किये जाते है। इनके बारे में निचे detail से बताया जा रहा है।

try

Try block में वे statements लिखे जाते है जिनसे run time error generate हो सकती है। इस block का general syntax निचे दिया जा रहा है।

try
{
     //Statements that may generate run time error
}

catch

Catch block में वे statements लिखे जाते है जो आप exception generate होने पर execute करवाना चाहते है। इस block को exception handler भी कहा जाता है। इसका syntax निचे दिया जा रहा है।

catch(exception-class obj)
{
    //Statements to handle exception
}

जैसा की आप ऊपर दिए गए syntax में देख सकते है catch block किसी function की तरह parameters define करता है। असल में यह parameter उस class के object को represent करता है जो try block में generate होने वाली errors को represent करती है।

उदाहरण के लिए लिए यदि try block में divide by zero से सम्बंधित error की संभावना है तो parameter के रूप में आप DivideByZeroException class का object define करेंगे।

एक बात आपको ध्यान रखनी चाहिए की जिस class type का object आप parameter के रूप में define करते है वह catch block उन्हीं errors को catch करता है। यानी की DivideByZeroException का object define करके आप IOExceptions को catch नहीं कर सकते है। इसके लिए आपको अलग से catch block define करना होगा।

आप एक से अधिक catch block define कर सकते है लेकिन try block एक ही होता है। जिस type की exception generate होती है उससे सम्बंधित catch block automatically execute हो जाता है। बाकी catch blocks skip कर दिए जाते है।

Finally

Finally block में वह code define किया जाता है जो exception generate हो या ना हो लेकिन हर case में execute होगा। इस block में मुख्यतः network और memory resources को free करने के लिए code लिखा जाता है। इसका syntax निचे दिया जा रहा है।

finally
{
    //Code that will be executed regardless of exception occurs or not.
}

Example of C# Exception Handling

निचे C# में exceptions को handle करना उदाहरण द्वारा समझाया जा रहा है।

using System;

class exceptionDemo
{
    static void Main(string[] args)
    {
          int num = 4;
          int result=0;

         try
         {
              result = num/0;
         }
         catch(DivideByZeroException e)
         {
              Console.WriteLine(“Following Exception Occurred : {0}”,e.Message);
         }
         finally
         {
             Console.WriteLine(“Result is : {0}”,result);
         }
    }
}

ऊपर दिया गया उदाहरण निचे दिया गया output generate करता है।

Following Exception Occurred : Attempted to divided by zero.
Result is : 0

Throwing Custom Exceptions

C# में आप खुद की (user defined) भी exception throw कर सकते है। इस प्रकार की exception आप किसी ऐसी situation के आने पर generate कर सकते है जिसे आप exceptional मानते है।

C# में custom exceptions throw करने के लिए आपको Exception class को inherit करना होता है। Exception class को inherit करने वाली class और throw keyword के माध्यम से ही exception throw की जाती है।

Exception class को inherit करने का syntax निचे दिया जा रहा है।

public class yourExceptionClassName : Exception
{
    public yourExceptionClassName(string message) : base(message) //Constructor
    {

    }
}

जैसा की आप ऊपर दिए गए syntax में देख सकते है Exception class को inherit करने के बाद आप स्वयं की class में एक constructor define करते है जो class का object create करने पर call होता है। यह constructor argument के रूप में string लेता है। यह string base class यानी Exception class को pass की जाती है और बाद में catch block में object द्वारा access की जाती है।

Exception class को inherit करने वाली class आपकी custom exception को represent करती है। इस class का object throw keyword के साथ प्रयोग किये जाने पर exception generate करेगा और argument के रूप में pass किये गए message को show करेगा।

Throw keyword द्वारा exception throw करने का syntax निचे दिया जा रहा है।

throw new yourExceptionClassName(“message-here”);

Throw और new keyword के द्वारा आप exception generate करते है और उसमें appropriate message pass करते है।

C# में user defined exceptions throw करना निचे उदाहरण द्वारा समझाया जा रहा है।

using System;

public class invalidCountryException : Exception
{
     public invalidCountryException(string message) : base(message)
     {

     }
}

class customExceptionDemo
{
    static void displayCountry(string country)
    {
        if(country!=”India”)
        {
              throw new invalidCountryException(“Invalid Country Exception : Our services are only available in India”);
        }

        Console.WriteLine(“Country is : {0}”,country);   
    }

    static void Main(string[] args)
    {
        string country=”Nepal”;
        try
        {
             displayCountry(country);
        }
        catch(invalidCountryException e)
        {
             Console.WriteLine(e.Message);
        }
    }
}

ऊपर दिया गया उदाहरण निचे दिया गया output generate करता है।

Invalid Country Exception : Our services are only available in India