I got caught with my pants down the other day when trying to explain
Try...Catch...Finally and things didn't work as I had assumed. Perhaps
someone can explain to me the purpose of Finally. I've looked at several
texts that I have and none of them address this specific point.
If I call some method that throws an exception in my routine Foo,
sub foo
call bar <- throws an exception
do something else <- never get here
end sub
control is passed back up the call stack to the first valid catch block.
So far so good.
Now if I do this
sub foo
try
call bar (which throws an exception)
catch
handle the exception <- only if exception thrown
end try
do something else <- since exception handled, do this
end sub
execution goes to the catch block and then continues to do something
else. So far so good.
If I do this
sub foo
try
call bar (which throws an exception)
catch
handle the exception <- only if exception thrown
finally
always do this
end try
do something else <- since exception handled, do this
end sub
the Finally block ALWAYS gets executed regardless of an exception being
thrown. Ok.
I submit that the second case is identical to the third case if I
rewrite number 2 as follows:
sub foo
try
call bar (which throws an exception)
catch
handle the exception <- only if exception thrown
end try
always do this
do something else <- since exception handled, do this
end sub
This begs the question - what is the use of Finally? I had assumed,
wrongly as it turns out, that in the event of an exception, Catch and
Finally would execute and control would return to the caller. If no
exception, Finally would execute and control continues to the next
statement.
I can see no use for Finally!
Sean 7 1612 sub foo try call bar (which throws an exception) catch handle the exception <- only if exception thrown finally always do this end try
do something else <- since exception handled, do this
end sub
the Finally block ALWAYS gets executed regardless of an exception being thrown. Ok.
I submit that the second case is identical to the third case if I rewrite number 2 as follows:
sub foo try call bar (which throws an exception) catch handle the exception <- only if exception thrown end try
always do this do something else <- since exception handled, do this
end sub
This begs the question - what is the use of Finally? I had assumed, wrongly as it turns out, that in the event of an exception, Catch and Finally would execute and control would return to the caller. If no exception, Finally would execute and control continues to the next statement.
I can see no use for Finally!
Sean
The finally always runs. After the finally, it's iffy. For example:
Dim conn As SqlConnection = New SqlConnection(...)
Dim ds As DataSet
Try
ds = GetDataFromDatabase(conn)
Catch ex As SqlException
' Log the error message or handle it some other way.
Return
Finally
' Perform cleanup, whether or not an exception was raised as well
' as whether or not we are exiting the function because of a
' raised exception, we still need to close the instance of the
' SqlConnection object...we can do that here. If we try to
' Return anywhere in a Try..Catch block, Finally will still be
' executed.
conn.Close()
End Try
' We only get this far if an exception was not thrown. The Finally
' block above was executed and the connection was closed.
DoSomethingWithTheDataSet(ds)
HTH! :)
Mythran
Finally always runs even if you are in a function and perform a hard return
statement finally is run ,, so it is the perfect place to put in code that
should run nomather what ( for example object cleanup code )
regrds
Michel Posseth
"Sean Kirkpatrick" <na**********@community.nospam> wrote in message
news:%2****************@TK2MSFTNGP09.phx.gbl... I got caught with my pants down the other day when trying to explain Try...Catch...Finally and things didn't work as I had assumed. Perhaps someone can explain to me the purpose of Finally. I've looked at several texts that I have and none of them address this specific point.
If I call some method that throws an exception in my routine Foo,
sub foo call bar <- throws an exception do something else <- never get here end sub
control is passed back up the call stack to the first valid catch block. So far so good.
Now if I do this
sub foo try call bar (which throws an exception) catch handle the exception <- only if exception thrown end try
do something else <- since exception handled, do this
end sub
execution goes to the catch block and then continues to do something else. So far so good.
If I do this
sub foo try call bar (which throws an exception) catch handle the exception <- only if exception thrown finally always do this end try
do something else <- since exception handled, do this
end sub
the Finally block ALWAYS gets executed regardless of an exception being thrown. Ok.
I submit that the second case is identical to the third case if I rewrite number 2 as follows:
sub foo try call bar (which throws an exception) catch handle the exception <- only if exception thrown end try
always do this do something else <- since exception handled, do this
end sub
This begs the question - what is the use of Finally? I had assumed, wrongly as it turns out, that in the event of an exception, Catch and Finally would execute and control would return to the caller. If no exception, Finally would execute and control continues to the next statement.
I can see no use for Finally!
Sean
Sometimes you don't want to handle the error at this function. That is,
you'll handle it somewhere else up the chain. If this happens, you
still need to clean up everything. Also, you don't have to use Catch in
a Try statement.
Try
Cursors.Current = Cursor.WaitCursor
ListView1.BeginUpdate()
' Do stuff.
Finally
Cursors.Current = Cursor.Default
ListView1.EndUpdate()
End Try
On Wed, 21 Sep 2005 10:39:05 -0700, Sean Kirkpatrick <na**********@community.nospam> wrote:
¤ If I do this
¤
¤ sub foo
¤ try
¤ call bar (which throws an exception)
¤ catch
¤ handle the exception <- only if exception thrown
¤ finally
¤ always do this
¤ end try
¤
¤ do something else <- since exception handled, do this
¤
¤ end sub
¤
¤ the Finally block ALWAYS gets executed regardless of an exception being
¤ thrown. Ok.
¤
¤ I submit that the second case is identical to the third case if I
¤ rewrite number 2 as follows:
¤
¤
¤ sub foo
¤ try
¤ call bar (which throws an exception)
¤ catch
¤ handle the exception <- only if exception thrown
¤ end try
¤
¤ always do this
¤ do something else <- since exception handled, do this
¤
¤ end sub
¤
¤ This begs the question - what is the use of Finally? I had assumed,
¤ wrongly as it turns out, that in the event of an exception, Catch and
¤ Finally would execute and control would return to the caller. If no
¤ exception, Finally would execute and control continues to the next
¤ statement.
¤
¤ I can see no use for Finally!
Yes, Finally always executes when the flow of control leaves the Try statement. It is an optional
keyword.
It guarantees the execution of code in the Finally block if an exception is generated in the Catch
block or when you execute an Exit Try statement.
Paul
~~~~
Microsoft MVP (Visual Basic)
Paul Clement wrote: ¤ I can see no use for Finally!
It guarantees the execution of code in the Finally block if an exception is generated in the Catch block or when you execute an Exit Try statement.
Ok, this answer makes some sense - if I'm in a Catch block and *another*
exception occurs, Finally will ensure that the original cleanup code
gets called, though I submit that in the case of Exit Try, there is no
difference between my original examples 2 & 3.
I'm going to have to play with it a bit to grock it completely.
Thanks Paul!
Sean
On 2005-09-21, Sean Kirkpatrick <na**********@community.nospam> wrote: Paul Clement wrote: ¤ I can see no use for Finally!
It guarantees the execution of code in the Finally block if an exception is generated in the Catch block or when you execute an Exit Try statement. Ok, this answer makes some sense - if I'm in a Catch block and *another* exception occurs, Finally will ensure that the original cleanup code gets called,
Keep in mind that often *another* exception is your own...
Try
DoSomething()
Catch(ex As Exception)
LogSomeInformation(ex.Message)
Throw
Finally
CleanUp()
End Try
....or, something I commonly do...
Try
DoSomething()
Catch(ex as Exception)
Throw New SpecificExceptionType(ex)
Finally
....
though I submit that in the case of Exit Try, there is no difference between my original examples 2 & 3.
They are, but that's because you're eating the exception, which should
be a very, very rare thing. Usually, Try-Finally blocks are much more
common than Try-Catch blocks..
Try
DoSomething()
Finally
' do your cleanup, and let the exception propagate up
....
Sean,
Know that you can set a try block in a try block
\\\
Try
connection.open
Try
do the reading
Catch
reader errohandling
return
End Try
Catch
connection open error handling
Finally
connection close 'this will always be done whatever error
End Try
///
I hope this helps,
Cor This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: ChrisB |
last post by:
Hello All:
I notice that when using try/catch blocks in C#, variables declared in the
try block go out of scope in the finally block.
So, for example, the following code generates a compiler...
|
by: Z D |
last post by:
Hi,
I was wondering what's the point of "finally" is in a try..catch..finally
block?
Isn't it the same to put the code that would be in the "finally" section
right after the try/catch block?...
|
by: Tilfried Weissenberger |
last post by:
Hi,
I am a bit confused as to what the FINALLY block is meant for.
What's the difference between:
this.Cursor = Cursors.WaitCursor;
try { //do some stuff }
catch { //handle exception }...
|
by: Pohihihi |
last post by:
I was wondering what is the ill effect of using try catch in the code, both
nested and simple big one.
e.g.
try
{
\\ whole app code goes here
} catch (Exception ee) {}
|
by: VB Programmer |
last post by:
Variable scope doesn't make sense to me when it comes to Try Catch Finally.
Example: In order to close/dispose a db connection you have to dim the
connection outside of the Try Catch Finally...
|
by: Woody Splawn |
last post by:
I have a try catch statement in a fucntion that is supposed to return a true
or a false
My code looks like this:
Try
mySqlConnection.Open()
Dim Da1 As New SqlDataAdapter("Select JnlType,...
|
by: cj |
last post by:
Another wish of mine. I wish there was a way in the Try Catch structure
to say if there wasn't an error to do something. Like an else
statement. Try Catch Else Finally.
Also because I...
|
by: foolmelon |
last post by:
If a childThread is in the middle of a catch block and handling an
exception caught, the main thread calls childThread.Abort(). At that
time a ThreadAbortException is thrown in the childThread. ...
|
by: David Lozzi |
last post by:
Howdy,
I ran into a very interesting issue and I'm curios as to how this is suppose
to work. I am using Try...Catch...Finally statements for all database
connectivity in my ASP.NET 2.0 web...
|
by: Kemmylinns12 |
last post by:
Blockchain technology has emerged as a transformative force in the business world, offering unprecedented opportunities for innovation and efficiency. While initially associated with cryptocurrencies...
|
by: Oralloy |
last post by:
Hello Folks,
I am trying to hook up a CPU which I designed using SystemC to I/O pins on an FPGA.
My problem (spelled failure) is with the synthesis of my design into a bitstream, not the C++...
|
by: Carina712 |
last post by:
Setting background colors for Excel documents can help to improve the visual appeal of the document and make it easier to read and understand. Background colors can be used to highlight important...
|
by: BLUEPANDA |
last post by:
At BluePanda Dev, we're passionate about building high-quality software and sharing our knowledge with the community. That's why we've created a SaaS starter kit that's not only easy to use but also...
|
by: Rahul1995seven |
last post by:
Introduction:
In the realm of programming languages, Python has emerged as a powerhouse. With its simplicity, versatility, and robustness, Python has gained popularity among beginners and experts...
|
by: Ricardo de Mila |
last post by:
Dear people, good afternoon...
I have a form in msAccess with lots of controls and a specific routine must be triggered if the mouse_down event happens in any control.
Than I need to discover what...
|
by: Johno34 |
last post by:
I have this click event on my form. It speaks to a Datasheet Subform
Private Sub Command260_Click()
Dim r As DAO.Recordset
Set r = Form_frmABCD.Form.RecordsetClone
r.MoveFirst
Do
If...
|
by: jack2019x |
last post by:
hello, Is there code or static lib for hook swapchain present?
I wanna hook dxgi swapchain present for dx11 and dx9.
|
by: DizelArs |
last post by:
Hi all)
Faced with a problem, element.click() event doesn't work in Safari browser.
Tried various tricks like emulating touch event through a function:
let clickEvent = new Event('click', {...
| |