On Sunday, 19 February 2012 at 20:57:09 UTC, Andrei Alexandrescu
wrote:
On 2/19/12 1:19 PM, Nick Sabalausky wrote:
That wouldn't be as useful. What the catcher is typically
interested in is
*what* happened, not *where* it happened.
But module organization is partitioned by functional areas.
For example, if I want to do something upon a network error,
minimum 99
times out of 100 I don't give a shit if it came from
libNetworkFoo or
libNetworkBar, and I don't *want* to care. What I care is
whether or not
there was a "network" error and possibly what *conceptual*
type of network
error.
Then it wouldn't help if each defined its own hierarchy.
The way I see it is, a "well-designed" package and module
hierarchy would naturally engender a "well-designed" exception
hierarchy. This is because packages and modules are organized
on functional areas, so e.g. there is an "std.net" package that
has its own exception types etc. There would be some special
cases indeed (e.g. a module initiating an exception defined in
another), so it's good those are possible too. I want to
automate the common case.
Furthurmore, what if I change some implementation detail to
use a different
module? Then I have to go changing all my catch blocks even
though it's
conceptually the same fucking error handled the same way.
That is an issue regardless. Occasional exception translation
is a fact of life.
However, I wouldn't object to the idea of an
"originatingModule" member
being added to Exception that's automatically filled by the
runtime (perhaps
lazily). Although really, I think what would be more useful
that that would
be "Does xxx module/package exist in the portion of the
callstack that's
been unwound?"
That's why PackageException!"tango.io" inherits
PackageException!"tango". That's all automatic. Essentially
there's 1:1 correspondence between package/module hierarchy and
exception hierarchy.
As far as "when to add or not add an exception class", it's
perfectly
reasonable to err on the side of too many: If there's an
unnecessary class,
you can just ignore it. Problem solved. If there's a missing
exception
class, you're shit out of luck. Case closed.
I disagree that having too many exception types comes at no
cost.
I can't shake the feeling that we're desperately trying to
reinvent the
wheel here. The round wheel is solid technology with a proven
track record,
we don't need to waste time evaluating all these square and
oval wheels just
for the fuck of it.
The wheel is not round. We just got used to thinking it is.
Exceptions are wanting and it's possible and desirable to
improve them.
Andrei
I just died a little reading this.
Are you suggesting that in order to handle IO exceptions I need
to:
try {
...whatever...
} catch (PackageException!"std.io") {...}
} catch (PackageException!"tango.io") {...}
} catch (PackageException!"otherLib.io") {...}
...
What the hell is wrong with just using an IOException?
AS Nick wrote, it seems you have a complete lack of understanding
of how exceptions work which is unsurprising coming from a c++
expert.
Also, this entire discussion you started about "improving"
exceptions looks to me like a combination of NIH syndrome
sparkled with heavy doses of premature optimization.