There's a bit more subtlety to rethrowing exceptions than most developers realize. Although this topic is covered very nicely at The .NET Guy blog, here's another example:
Try
session = smgr.getSession(_strDocbaseName)
Catch ex As Exception
If ex.Message.IndexOf("authentication failed") > 0 Then
Throw New Exception("more info about the exception", ex)
Else
Throw
End If
End Try
The important thing here is to preserve the call stack, and that means
Throw ex
... would do the same thing, but less code is almost always better, IMO.
So then the next natural question that most developers ask is, "When should I catch exceptions"? And it's a very good question. Here are some guidelines that I have found useful.
System.Exception whenever possible; try to catch just the specific errors that are specific to that block of code. Catch System.IO.FileNotFound instead.
Posted by Jeff Atwood View blog reactions
« Go, Monkey! DEVELOPERS^3 »
Clarification:
Throw ex
does NOT preserve the existing exception call stack (eg the stack will start with this line of code)
Throw
DOES preserve the existing exception call stack (eg this code will not appear anywhere in the stack)
Very important!
Jeff Atwood on February 16, 2005 01:27 AMThrow and Throw ex are not the same thing :)
http://www.tkachenko.com/blog/archives/000352.html
http://www.dotnetdevs.com/advice/RethrowingExceptions.aspx
> In .Net however, when you do "throw ex;", ex is being re-thrown, but the original stack trace info gets overriden.
Niktu, that's exactly what I clarified in the comment above from Feb 2005..
Jeff Atwood on April 3, 2006 09:20 AMAh, yes ...
But did You point it out that using "Throw" doesn't yeld exactly same results as not catching exception in first place?
(in call stack the line number from try block generating exception gets replaced by line number of "Throw" statement - that could be significant loss of information if you happen to call same metod in multiple places of that try block ... as you could read in comments of my first link :)
| Content (c) 2008 Jeff Atwood. Logo image used with permission of the author. (c) 1993 Steven C. McConnell. All Rights Reserved. |