The Right Approach to Exceptions
Jonathan M Davis
jmdavisProg at gmx.com
Sat Feb 18 16:37:04 PST 2012
On Saturday, February 18, 2012 16:36:16 H. S. Teoh wrote:
> On Sat, Feb 18, 2012 at 05:13:16PM -0600, Andrei Alexandrescu wrote:
> > On 2/18/12 4:26 PM, Jonathan M Davis wrote (abridged):
> > GetOptException
> > FlagArgumentMissingException
> > InvalidFlagArgumentException
> > UnknownFlagException
> > FileException
> > FileNotFoundException
> > NotFileException
> > NotDirException
> > AccessDeniedException
> >
> > I died inside a little.
>
> [...]
>
> That's because you're missing the hierarchy, which may look more like
> this:
>
> Error
> +--Exception
> +--GetOptException (bad name, I prefer CommandLineException)
>
> | +--FlagArgumentMissingException
> | +--InvalidFlagArgumentException
> | +--UnknownFlagException
>
> +--FileException
>
> | +--FileNotFoundException
> | +--NotFileException
> | +--NotDirException
> | +--AccessDeniedException
>
> +--IOException (OK, I added this branch, just to show the idea)
> +--ReadErrorException
> +--WriteErrorException
>
> So if all you care about is to handle command-line option parse errors,
> and don't care which error it is, you could just catch GetOptException.
> If all you care about is file access exceptions, you can just catch
> FileException without having to worry which specific exception it is.
>
> Alternatively, if you don't care which exception it is at all, then
> just catch Exception.
>
> That's the whole point of a (well-designed) exception hierarchy. It lets
> you be as generic or as specific as you want.
>
> Note also, that an elaborated exception hierarchy lets you attach
> additional specific information that might be useful in error recovery.
> For example, FileException may have a field containing the filename that
> caused the error, so that if the program is processing a list of
> filenames, it knows which one went wrong. You would not want such
> information in Exception, because it only applies to FileException's.
>
> Similarly, GetOptException (or CommandLineException) may have additional
> fields to indicate which option is malformed. Such information,
> obviously, shouldn't be in other kinds of exceptions but those that
> inherit GetOptException.
Exactly!
And in order to programmatically handle exceptions rather than simply print
out messages, that hierarchy and the extra information that the derived
exceptions give is necessary.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list