In one case you
try { Throws(); } catch(Exception ex) { DoHandling(); throw ex; } // BAD!
This one does lose the initial site of the first exception, and throws it as a new exception at this location, centering the stack trace on this line.
This is what you want to do:
try { Throws(); } catch { DoHandling(); throw; }
Notice you do not name, or capture the exception. This causes your handling to execute, but crucially it re-throws the original exception untouched, with the original stack trace, centering on the original exception thrown location.
So you can easily lose that information if you re-throw naively. Good code tools should yell at you for doing this most of the time. Note in some cases you want to add information, so you can throw a new exception with new information, but set the InnerException property to the original causing exception.
See http://msdn.microsoft.com/en-us/library/system.exception.inn...