[Python-ideas] Type hints for functions with side-effects and for functions raising exceptions

Steven D'Aprano steve at pearwood.info
Thu Feb 21 06:04:07 EST 2019


On Thu, Feb 21, 2019 at 07:05:55PM +1100, Chris Angelico wrote:

[Ben]
> > Other functions also conceptually have three ways of returning:
> > ordinary return with a value, a documented special return like
> > KeyError, and pass-through exceptions. If the pass-through exception
> > is KeyError, it gets conflated with the documented exceptional return,
> > but correct code should handle them differently. It doesn't matter
> > whether the syntax for the documented special return is "return x" or
> > "raise KeyError(x)".
> 
> Not sure what you mean here. If the documented special return is
> "return x", then it's a value that's being returned. That's completely
> different from raising some sort of exception.

I think I understand what Ben means, because I think I've experimented 
with functions which do what he may be getting at.

Remember that exceptions are not necessarily errors. So you might write 
a function which returns a value in the standard case, but raises an 
exception to represent an exceptional case. If this is not an error, 
then the caller ought to be prepared for the exception and always catch 
it.

This could be considered an alternative design to returning a tuple:

    (True, value)  # standard case
    (False,)       # or raise an exception


If this seems strange, it actually isn't *that* strange. It is very 
similar to the way iterators yield a value in the standard case, and 
raise StopIteration to signal the non-standard, non-erroneous but 
exception case of having reached the end of the iterator.

Another potential example would be searching, where "Not Found" is not 
necessarily an error, but it is always an exceptional case. The 
built-ins raise KeyError or ValueError (for str.index) but they could 
have just as easily raise KeyNotFound and SubstringNotFound.

So exceptions do not necessarily represent errors that should bubble up 
to the user, to be reported as a bug. They can also represent an 
alternative (if slightly clumsy) mechanism for passing information to 
the caller.


-- 
Steven


More information about the Python-ideas mailing list