Use a 'try-finally' block without a 'catch' block
Solution 1:
You would use it to ensure some actions occur after the try
content or on an exception, but when you don't wish to consume that exception.
Just to be clear, this doesn't hide exceptions. The finally
block is run before the exception is propagated up the call stack.
You would also inadvertently use it when you use the using
keyword, because this compiles into a try-finally
(not an exact conversion, but for argument's sake it is close enough).
try
{
TrySomeCodeThatMightException();
}
finally
{
CleanupEvenOnFailure();
}
Code running in finally
is not guaranteed to run, however the case where it isn't guaranteed is fairly edge - I can't even remember it. All I remember is, if you are in that case, chances are very good that not running the finally
isn't your biggest problem :-) so basically don't sweat it.
Update from Tobias: finally
will not run if the process is killed.
Update from Paddy: Conditions when finally does not execute in a .net try..finally block
The most prevalent example you may see is disposing of a database connection or external resource even if the code fails:
using (var conn = new SqlConnection("")) // Ignore the fact we likely use ORM ;-)
{
// Do stuff.
}
Compiles into something like:
SqlConnection conn;
try
{
conn = new SqlConnection("");
// Do stuff.
}
finally
{
if (conn != null)
conn.Dispose();
}
Solution 2:
using
is equivalent try-finally
. You will only use try-finally
when you want to do some clean up inside finally
and don't care about the exception.
The best approach will be
try
{
using(resource)
{
//Do something here
}
}catch(Exception)
{
//Handle Error
}
Doing so even clean up called by using
fails, your code will not fail.
There are some condition when finally
will not get executed.
- If there is any
StackOverflowException
orExecutingEngineException
. - Process is killed from external source.
Hope this answers your doubt.