[Tutor] functions: use return or exceptions?

Steven D'Aprano steve at pearwood.info
Fri Sep 24 02:54:01 CEST 2010


On Fri, 24 Sep 2010 06:06:25 am Luke Paireepinart wrote:
> You should do both. Raise an exception in the exceptional case.
>
> My general pattern is to return None if no results exist, return the
> results if they do exist, and raise an exception if I couldn't
> perform the function.

I hate that! I find that idiom, as used by the re module, to be the 
worst of all possible worlds.

To do something with a search result, you have to:

be prepared for an exception (either catch it, or let it bubble up the 
call chain);

if you get a result, you have to compare it to None and be prepared to 
ignore it;

if the result isn't None, then you can do something with it. This itself 
may include further tests or catching exceptions.

At the interactive interpreter, you can't write (say):

regex.search(text).group()

because the result is sometimes None. So you have to split it into two 
operations:

mo = regex.search(text)
if mo: mo.group()

That's a nuisance when working interactively. I would prefer it if the 
re search functions returned a "blank" match object, so you could say:


re.search('sp.m', 'I like spam and eggs').group(0)
=> prints 'spam'

re.search('sp.m', 'I like ham and eggs').group(0)
=> prints ''


> Eg. If I have a function that creates a list of users with a first
> name of bob, I'll return the users or None (or probably an empty
> list) 

Returning an empty list makes sense. Returning None makes no sense at 
all.


> but if the db connection is unsuccessful I'll let the exception 
> it throws propagate back up from my function, or possibly trap and
> rethrow the exception.

That's okay.


> Or if a db connection error shouldn't matter to the calling function,
> I just won't re raise the exception.

That's a reasonable approach as well.




-- 
Steven D'Aprano


More information about the Tutor mailing list