Skip to main content

C# Try Catch & Finally Demystified

One can wonder what can be there to demystify the try catch and finally block,

There are some tricky scenarios in this area

Lets see what are all that:

Ideally Try is used along with Catch, so if any exception arises then it will be get catch in the catch block and based on the  business's preference he / she may want to throw using throw keyword or write in log file or do any other action.

The Try Catch Finally works in the following mannaer


Step 1: Control Comes inside the try block.
Step 2: If the code inside the try executes normal then the control goes to finally block.
Step 3: If the code inside the try is throwing error then it will execute the contents of the catch and then go to finally block.
Step 4: In finally block thw CLR will free up the resources used in that try block.
Step 5: If the function returns the control inside the try block, then also the control will finally comes to finally.
Step 6: You cannot return the control from a finally block, if you do so you will get an compiler error as "Control cannot leave the body of a finally clause".
          
Example 1: Normal Try Catch and Finally block

     static void Main(string[] args)
        {
            string ReturnValue = GetValueFromMethod();
            Console.WriteLine(ReturnValue.ToString());
            Console.ReadLine();
        }
        private static string GetValueFromMethod()
        {
            string ReturnValue = "Initial Value";
            try
            {
                int DividedByValue = 0;
                return ReturnValue;
            }
            catch (Exception Ex)
            {
                // throw Ex;
                return "Catch Value";
            }
            finally
            {
                // The memory will be get cleared here
                ReturnValue = "Finally Value";
            }
        }


Output:

Initial Value

Lets go little deeper by introducing an error

Example 2:

        static void Main(string[] args)
        {
            string ReturnValue = GetValueFromMethod();
            Console.WriteLine(ReturnValue.ToString());
            Console.ReadLine();
        }
        private static string GetValueFromMethod()
        {
            string ReturnValue = "Initial Value";
            try
            {
                int DividedByValue = 0;
                if (100 / DividedByValue == 0)
                {

                }
                return ReturnValue;
            }
            catch (Exception Ex)
            {
                // throw Ex;
                return "Catch Value";
            }
            finally
            {
                // The memory will be get cleared here
                ReturnValue = "Finally Value";
            }
        }   


Output: 

Catch Value



The main purpose of the finally is to free up the memory, but in the below case we can still assign the values in the finally block.


protected static string PassingValue = "Initial Value";
        static void Main(string[] args)
        {
            string ReturnValue = GetValueFromMethod();
            Console.WriteLine("Returned Value: "+ReturnValue.ToString());
            Console.WriteLine("PassingValue: " + PassingValue);
            Console.ReadLine();
        }
        private static string GetValueFromMethod()
        {           
            try
            {
                int DividedByValue = 0;
                if (100 / DividedByValue == 0)
                {

                }
                return PassingValue;
            }
            catch (Exception Ex)
            {
                // throw Ex;
                return "Catch Value";
            }
            finally
            {
                // The memory will be get cleared here, but assigning the values here again
                PassingValue = "Finally Value";
            }
        }
}


Output:

Returned Value: Catch Value
PassingValue: Finally Value

(To be continued)



  

Comments

Popular posts from this blog

Task Parallel Library (TPL) and Akka.NET: Differences

Task Parallel Library (TPL) and Akka.NET are both powerful tools in the .NET ecosystem for handling parallelism and concurrency, but they serve different purposes and use different models of computation. Here are some key differences:s 1.    Actor Model vs Task-Based Model: Akka.NET is built around the actor model, where actors are the fundamental units of computation and they communicate by exchanging messages. TPL, on the other hand, is task-based. It's designed to make developers more productive by simplifying the process of adding parallelism and concurrency to applications. TPL uses tasks (which are independently executing work units) and provides various ways to control and coordinate them. 2.    Fault Tolerance: One of the key features of Akka.NET is its built-in fault tolerance. It has a "let-it-crash" philosophy, where the system is designed to self-heal from errors. If an actor fails, its parent actor can decide on the supervision strategy: either to resta

Extension Methods - Advanced

Here we will see how can we use the Extension Methods in advanced manner in other types Imagine you often need to retrieve items from a List based on a custom criterion that the built-in LINQ methods don't cover. Extension Methods for Lists: Filtering based on Custom Criteria And the output would be   Extending Enums: Displaying Descriptive Strings Output: Extending DateTime: Calculating Age     Output: The code samples can be found at https://github.com/oneananda/C_Sharp_Examples/tree/main/ExtensionMethods