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.
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 1: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 10: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 :)
Distinction between throw and throw ex is very helpful to me. I was not aware of this difference!
James on December 23, 2008 5:18 AMThere's no distinction between throw and throw ex - it's just that Throw is a verb that needs an object, and ex happens to be the exception object (from Catch ex as exception).
With catch x then throw ex, if you picture ex as a ball, it would be caught, then thrown again.
With throw new exception(text,ex), the ex ball will be caught, stuck inside an even larger ball with text written on it, then thrown again.
Jake on December 23, 2008 7:42 AMThe comments to this entry are closed.
|
|
Traffic Stats |