Simon  Willison wrote:
> I have an API design question. I'm writing a function that can either
> succeed or fail. Most of the time the code calling the function won't
> care about the reason for the failure, but very occasionally it will.
>
> I can see a number of ways of doing this, but none of them feel
> aesthetically pleasing:
[snip]

Whether it's aesthetically pleasing or not, raising an exception is the
way to do it.

You seem to care about your users.  Keep this in mind: if your function
returns an error code, then it puts an burden on users to A. always
check for errors, and B. always check for errors right at the point
where the function is called.

Python has exceptions so that programmers can write code without
checking for an error in every other line like they would have to in C.
 With exceptions, users are free to not bother checking for errors, if
program termination is acceptable, or to handle the exception somewhere
else.  Please don't circumvent this on the misguided pretense of
"helping" the user.

If you really think most users would prefer to check the return value
for an error, then I'd recommend two versions of the function: the
regular, Pythonic version that raises exceptions, and the convenience
version that swallows the exception and returns a code.  (Compare a[1]
vs. a.get(1).)


> This is nice and simple but suffers from cognitive dissonance in that
> the function returns True (or an object evaluating to True) for
> failure.

BTW, this is true in a lot of places.  Back in the days of DOS, zero
meant success, non-zero was an error code.  Zero also signals success
for process exit codes on Unix.  Also on Unix, negative values are
often considered errors, non-negative success.  The idea that error ==
0 is not self-evident, and often not true.

If it helps, consider using string error codes, or defining some
constants to check against ("if error == NO_ERROR").


Carl Banks

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to