On Friday, 8 March 2013 at 09:07:59 UTC, Chris Cain wrote:
On Friday, 8 March 2013 at 09:01:14 UTC, Jonathan M Davis wrote:
If that's the case, I really don't see what the problem is.
It's just a few
characters difference.
To be honest, the way I look at it, D does this _better_.
"throw;" looks like magic and it's accessing global
(potentially mutable) state to do something. I haven't done
much research into C++'s handling of exceptions (and, in
particular, this feature), but I'd be _very_ weary of doing
that without knowing whether this global state is thread local
or shared. If it's shared, you would have some nice heisenbugs
pop up if this was used in multithreaded code.
Using "catch(Exception E) { throw Trace(E); }" is more explicit
to what Trace needs to work and, IMO, a better design.
The point I'm trying to illustrate is difficult to understand
unless you have to personally implement 1000 try/catch statements
in your code base. You'll never know how a seemingly trivial item
like re-specifying the same pointless catch statement over and
over and over again quickly adds up and the frustration knowing
that there's a simple solution at hand, but it's not available in
what is otherwise a much better language than the one that has
the solution.
I'm not at all trying to make a case that D's exception handling
is somehow inferior to C++. What tends to happen with D is that
it's very close to being "really really good" but it is not yet
refined to the same degree that a mature language is, so there
are always a few items here and there that could be made to work
better. Pointing them out is not an attack on D, it's what is
necessary to improve the language.
I suspect it is simple to implement a safe re-throw in D, it's
just hard to see why you would want to use it unless you have the
experience of making use of try catch very frequently in a large
code base.
--rt