raise None
Mark Lawrence
breamoreboy at yahoo.co.uk
Thu Dec 31 10:58:56 EST 2015
On 31/12/2015 00:09, Steven D'Aprano wrote:
> I have a lot of functions that perform the same argument checking each time:
>> def spam(a, b):
> if condition(a) or condition(b): raise TypeError
> if other_condition(a) or something_else(b): raise ValueError
> if whatever(a): raise SomethingError
> ...
>> def eggs(a, b):
> if condition(a) or condition(b): raise TypeError
> if other_condition(a) or something_else(b): raise ValueError
> if whatever(a): raise SomethingError
> ...
>> Since the code is repeated, I naturally pull it out into a function:
>> def _validate(a, b):
> if condition(a) or condition(b): raise TypeError
> if other_condition(a) or something_else(b): raise ValueError
> if whatever(a): raise SomethingError
>> def spam(a, b):
> _validate(a, b)
> ...
>> def eggs(a, b):
> _validate(a, b)
> ...
>> But when the argument checking fails, the traceback shows the error
> occurring in _validate, not eggs or spam. (Naturally, since that is where
> the exception is raised.) That makes the traceback more confusing than it
> need be.
I disagree.
>> So I can change the raise to return in the _validate function:
>> def _validate(a, b):
> if condition(a) or condition(b): return TypeError
> if other_condition(a) or something_else(b): return ValueError
> if whatever(a): return SomethingError
>> and then write spam and eggs like this:
>> def spam(a, b):
> ex = _validate(a, b)
> if ex is not None: raise ex
> ...
>> It's not much of a gain though. I save an irrelevant level in the traceback,
> but only at the cost of an extra line of code everywhere I call the
> argument checking function.
>> But suppose we allowed "raise None" to do nothing. Then I could rename
> _validate to _if_error and write this:
>> def spam(a, b):
> raise _if_error(a, b)
> ...
>>> and have the benefits of "Don't Repeat Yourself" without the unnecessary,
> and misleading, extra level in the traceback.
>> Obviously this doesn't work now, since raise None is an error, but if it did
> work, what do you think?
>
A lot of fuss over nothing.
--
My fellow Pythonistas, ask not what our language can do for you, ask
what you can do for our language.
Mark Lawrence
More information about the Python-list
mailing list