The Right Approach to Exceptions
Jonathan M Davis
jmdavisProg at gmx.com
Sun Feb 19 01:11:24 PST 2012
On Sunday, February 19, 2012 02:04:50 Andrei Alexandrescu wrote:
> On 2/19/12 12:56 AM, Jonathan M Davis wrote:
> > I think that being able to have a catch block which took multiple
> > exception
> > types would be plenty. There are times when it would be very valuable to
> > be
> > able to use the same catch block for multiple exceptions without having to
> > catch their base type (which would then potentially catch other exceptions
> > which you didn't want to catch). So, something like that second catch
> > block
> > that you have there would be very valuable.
>
> So now hierarchies are not good?
No. Sometimes you want to catch specific types and handle a subset of them in a
particular way but don't want to handle _all_ of the exceptions with the same
base class the same way. For instance, if you had the following and all of
them are derived from FileException (save FileException itself):
catch(e : FileNotFoundException, NotAFileException)
{
//...
}
catch(AccessDeniedException e)
{
//...
}
catch(FileException e)
{
//...
}
You want to handle certain exceptions differently and you want to handle some
of them the same, but you don't want to handle all FileExceptions the same
way. Without a way to put multiple exception types in the same block, you tend
to end up with code duplication (and no I'm not necessarily advocating that we
have those specific exception types - they're just examples).
It's even worse if you don't have much of a hierarchy, since if _everything_
is derived from Exception directly, then catching the common type - Exception
- would catch _everything_. For instance, what if you want to handle
StringException and UTFException together but FileException differently? You
can't currently do
catch(e : StringException, UTFException)
{
//...
}
catch(FileException e)
{
//...
}
Right now, you'd have to have separate catch blocks for StringException and
UTFException.
A well-designed exception hierarchy reduces the problem considerably, because
then there's a much higher chance that catching a common exception will catch
what you want and not what you don't, but that doesn't mean that you're never
going to run into cases where catching the common type doesn't work.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list