The Right Approach to Exceptions

Jonathan M Davis jmdavisProg at gmx.com
Fri Feb 24 15:48:47 PST 2012


On Friday, February 24, 2012 16:38:31 Steven Schveighoffer wrote: 
> On to my second point. One of the issues I have with Java is that
> exceptions are *overused*. For example, EOF should not be an exception,
> most files have ends, it's not a very exceptional situation. If there is
> an intuitive way to use an existing return value to convey an error rather
> than an exception, I'd prefer the return value. There is a runtime cost
> just for setting up a try/catch block, even if no exceptions are thrown.

It's definitely true that Java uses exceptions when they shouldn't - EOF being 
a good example of that. Exceptions should almost always only be used when 
something actually goes wrong. EOF is not something going wrong.

However, Java does have a great exception hierarchy, much of which is 
standard. And that's a lot better than having only a handful of unrelated 
exceptions, let alone having all exceptions be specific to a module like we do 
now.

So, we really have 2 problems here:

1. Phobos doesn't have a proper exception hierarchy. Its exceptions need to be 
better organized according to the problem that they indicate rather than by 
module.

2. There are something things that can be done to Exception and how exceptions 
work in D to help resolve issues related to wanting to catch and handle 
exceptions without having to catch all exceptions that match their common base 
type or otherwise have to duplicate code among catch blocks.

The two proposals that seem best for this are

1. Being able to annotate catch blocks in some manner to enable them to catch 
multiple, specific exceptions - either by using some kind of condition

catch(Ex1 e) if(condition)

which, as you point out, would have to be done at runtime, or by doing 
something similar to what Java 7 is doing and make it so that multiple 
exceptions can be caught with the same block

catch(Ex1, Ex2, Ex3 e)

and e ends up being the most derived type that is common to them.

2. Andrei's Variant[string] proposal, which would enable a generic formatting 
scheme with string templates which a free function could use to generate 
messages from exceptions without caring about the actual exception type. It 
would also allow you to tack on extra information to the exception which 
wouldn't normally be part of that type of exception but your particular 
program needs for some reason.

So, if we better organize Phobos' exceptions, implement a multi-catch feature, 
and implement Andrei's Variant[string], then Phobos' exceptions will work far 
better (and by far more reusable), and some of the greater shortcomings of D's 
exceptions themselves should be mitigated, if not eliminated.

Naturally, that still won't stop people from doing stupid things with 
exceptions in their own code (like throwing on EOF), but we'll have a good 
setup for those who use exceptions properly, and we should be able to avoid 
putting stupid uses of exceptions in Phobos, simply because the code is open 
and peer-reviewed, and I think that most of the people around here agree that 
using exceptions for stuff like EOF is stupid.

- Jonathan M Davis


More information about the Digitalmars-d mailing list