You're confusing the Exception.StackTrace with the actual CLR stack trace. The minute you catch an exception in the CLR the accurate trace is destroyed. This is pathological for crash dumps, where it's imperative that you have an accurate trace for debugging.
If you don't believe me, go into VS and do the following.
1. Throw an exception.
2. Make sure that exception is not listed in exceptions to break on.
3. Catch and rethrow that exception using "throw;".
4. Let that exception filter out of the program unhandled.
5. Run in debugger.
Notice where your stack trace is centered on -- the "throw;" call.