Hmmm. So I guess my question is, if all those subclasses do the same thing, am I getting anything out of creating them all?
You get a more convenient syntax for catching particular exceptions. For example:
if ( my $e = MyException->caught ) {
...
} elsif ($@) {
die $@;
}
much easier than delving into fields to figure out what kind of exception has been thrown.
You also get a simple way to represent a hierarchy of exception types. If you have a general ValidationError exception class, with a DateValidation, NameValidation, etc. subclasses then you could capture all of the subclasses with a single ValidationError->caught.