On Monday, 1 April 2013 at 17:28:11 UTC, H. S. Teoh wrote:
On Mon, Apr 01, 2013 at 01:08:15PM +0200, Lars T. Kyllingstad
wrote:
It's time to clean up this mess.
http://wiki.dlang.org/DIP33
I'd prefer "NetworkException" instead of "NetworkingException"
(long
name with no added advantage).
Agreed. I have changed it now.
About the use of enums in FilesystemException,
NetworkingException,
etc.: I understand the rationale for them, but this also makes
them
closed for extension. Is there anything fundamentally wrong with
creating subclasses of these exceptions instead of attempting
to cover
*all* possible problems in a single enum?
Phobos/druntime devs will have the opportunity to add enum fields
to cover every error category in those libraries, and the users
themselves can still extend the classes the "normal" way. As you
may have noticed, the first member of each enum is "unknown",
which is meant for errors that do not fall into any of the other
categories. (There may be a better name for this, like "other",
and maybe there should be a separate enum member called
"userDefined"?)
My problem with subclasses is that they are a rather heavyweight
addition to an API. If they bring no substance (such as extra
data), I think they are best avoided.
I like the use of chaining to attach errno or windows system
errors to
exceptions. This solves the problem of errno's not being easily
mapped
to one of the standard exception classes. It's sort of the
reverse of
what chaining was intended for (another exception being thrown
while the
first one was in transit), but I haven't actually seen any real
use case
for the latter, so we might as well use it for the purpose here.
The only thing is, this makes library code a bit trickier to
write.
Maybe Phobos needs to provide some kind of standard (though
system-specific) way of mapping errno, windows error codes,
etc., into
one of the standard exception types, so that this mapping won't
have to
be duplicated all over the place. Obviously it can't be
completely
automatic, since some errno's may map to different exceptions
depending
on context, but *some* amount of mapping would be highly
desirable to
avoid code duplication.
This is a good idea.
Another nice thing to have (not sure how practical it will be)
is to add
more information to the exceptions under Exception. To truly
free us
from the tendency to just invent GetoptException, XMLException,
RegexException, etc., we need to consider that sometimes you
*do* want
to know where the exception came from. For example, you could
be calling
std.getopt from some generic initialization code that does
other stuff
too, both of which may throw a ConversionException, say.
Sometimes you
need to distinguish between them (display a command-line syntax
help in
one case, just display an error in the other case, depending on
where
the exception came from). One solution is to add a locus field
to
Exception:
class Exception : Error {
...
/// Where this exception came from
/// E.g., "std.getopt", "std.xml",
/// "my.program.init.complexconv", etc..
string locus;
}
This way the catching code doesn't have to downcast, guess, or
do some
ugly non-portable hacking to figure out what to do.
This field should probably be automatically filled by
Exception's ctor,
so that it doesn't require additional burden on the programmer.
I'm not 100% sure the module name should be used in this field,
but the
idea is that it should contain some way of identifying the
origin of the
exception that can be programmatically identified.
My first though was: "Isn't this what the stack trace is for?",
but then again, that's rather bothersome to parse
programmatically. I'm not completely sold on the idea of tagging
exceptions with their modules of origin, but I don't have any
good alternatives, either.
Lars