The Right Approach to Exceptions

foobar foo at bar.com
Sun Feb 19 22:44:59 PST 2012


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.


More information about the Digitalmars-d mailing list