The Right Approach to Exceptions

Ben Davis entheh at cantab.net
Sat Feb 18 17:43:27 PST 2012


On 19/02/2012 00:48, Jonathan M Davis wrote:
> On Saturday, February 18, 2012 16:46:43 H. S. Teoh wrote:
>> I can't believe something this simple has to be explained so
>> elaborately. I thought all of us here knew how to use OO??
>
> I think that the problem stems from people frequently using exceptions
> incorrectly, and many of the C++ programmers probably haven't _ever_ seen them
> used correctly, since I don't think that it's very common for C++ programs to
> define exception hierarchies - especially not advanced ones like Java has. And
> when you see a lot of bad exception code, that tends to turn you off to them,
> and it definitely doesn't show you how to use them correctly.
>
> - Jonathan M Davis

I can assure you they get misused in Java too. Most people write this:

try {
    lots and lots and lots of stuff here
}
catch (Exception e) {}

All they wanted to do was get round the compile error because they 
called Thread.sleep() which throws InterruptedException which you're 
required to catch, and they know they're never going to call 
Thread.interrupt().

What they end up doing is catching NullPointerException, 
ArrayIndexOutOfBoundsException and all the other things that really 
matter, and nasty bugs can go undiagnosed.

Eclipse's auto-fix impoves things a little - it can generate this for you:

try {
	...
}
catch (InterruptedException e) {	//For example
	//TODO: auto-generated catch block
	e.printStackTrace();
}

But no one does their TODOs, and no one takes care to keep the console 
output short enough to be useful.

You CAN write "throw new RuntimeException(e)", and you won't be required 
to catch that one. And then exceptions are incredibly useful, and I've 
even found rare cases where creating my own checked exception makes an 
API much safer. (I was processing code, and I had something like an 
'uninline' operation that occasionally couldn't work, so the caller had 
to always have a backup plan in case the exception was thrown.)

So it could be a good system, but no one has any idea what they're doing 
with it.

If I had to improve the Java one, I suppose I would:

- distinguish between 'bug' exceptions (e.g. null) and 'you're more 
likely to want to catch this' exceptions (e.g. IO). Maybe the bug ones 
should have been Errors, since people *usually* don't catch those (and 
are certainly never required to). As it stands, Errors are reserved for 
corrupt class files and other VM panic scenarios.

- make sure the 'lazy' approach is a good one: the less you type, the 
fewer exceptions you catch, and the less likely you are to silence those 
exceptions at runtime. Probably the main problem with the exception 
hierarchy is that the short names tend to be the more general ones that 
are more dangerous to catch indiscriminately.


More information about the Digitalmars-d mailing list