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