The new std.process is ready for review

Jonathan M Davis jmdavisProg at gmx.com
Tue Feb 26 10:47:56 PST 2013


On Tuesday, February 26, 2013 09:02:11 Steven Schveighoffer wrote:
> On one hand, I think the correct behavior is to return null, and let the
> program deal with checking the error, or use get if they have a default.
> If we throw an exception, people will end up catching the exception in
> order to avoid an unintended error. Exceptions are not good for flow
> control, they are for exceptional situations that you didn't plan for.

I think that it's far more correct to say that exceptions are for situations 
where it's reasonable for code to assume that something's the case when it 
might not be or when it's impossible for it to check. For instance, it's much 
cleaner to write a parser if the parser in general assumes that operations 
will succeed and throws when they don't. Then only a small part of the parser 
needs to worry about handling error cases. Or an example of when it would be 
impossible to check would be with file operations. You can (and should) check 
beforehand that the file exists, but there's no way to guarantee that the file 
will still exist when you actually operate on it (e.g. another process could 
delete it out from under you), so the file functions have to throw when the file 
isn't there anymore or you don't have permissions or whatever.

If you have to keep checking return values for functions, then you should 
probably be using exceptions. The place to avoid exceptions is when the odds 
of an operation succeeding are low (or at least that there's a fairly good 
chance that it'll fail), because then it really is just becoming flow control. 
But I actually think that pushing for exceptions to be for "exceptional 
situations" is harmful, as that leads to people not using them, and the code 
ends up checking return values when it would be much cleaner if it didn't have 
to. Of course, there are plenty of people who are quite poor at that balance 
and end up over-using exceptions as well, so striking a good balance can be 
hard.

In general though, the main question is whether it's reasonable for code to 
assume that an operation will succeed, and if it is, then an exception should 
be used. In the case of environment variables, whether that's reasonable or 
not depends on the code. There are programs out there which pretty much can't 
run if a particular environment variable hasn't been set (I deal with several 
at work which are that way), and if the program itself set the enviornment 
variable, then it should be able to assume that it's there. In either case, 
the exception route makes more sense. On plenty of other occasions though, 
it's not at all reasonable to assume that it's there and the code needs to 
check, in which case, throwing an exception doesn't make sense at all.

But given the fact that opIndex is already generally assumed to succeed, I 
think that it makes perfect sense to make it throw on failure, and then have 
get return null on failure. Programs can then use whichever behavior is 
correct for their particular needs.

- Jonathan M Davis


More information about the Digitalmars-d mailing list