[openstack-dev] [Review] Use of exception for non-exceptional cases
Doug Hellmann
doug.hellmann at dreamhost.com
Wed Jul 10 20:30:29 UTC 2013
On Wed, Jul 10, 2013 at 3:57 PM, David Ripton <dripton at redhat.com> wrote:
> On 07/10/2013 02:01 PM, Nachi Ueno wrote:
>
>> HI folks
>>
>> I would like to ask the review criteria in the community.
>>
>> Should we use exception for non-exceptional cases when we can use
>> parameter checking?
>>
>> Example1: Default value for array index
>>
>> try:
>> value = list[5]
>> except IndexError:
>> value = 'default_value'
>>
>> This can be also written as,
>>
>> list_a[3] if len(list_a) > 3 else 'default_value'
>>
>
> Both of these are fine. Neither deserves to be banned.
>
> But LBYL is often naive in the face of concurrency. Just because
> something was true a microsecond ago doesn't mean it's still true.
> Exceptions are often more robust.
getattr() takes a default and, as it is implemented in C, is thread-safe.
So:
value = getattr(my_obj, 'might_not_be_there', 'default')
Of course, it's probably better to make sure you've always got the same
type of object in the first place but sometimes the attributes change
across versions of libraries.
For accessing elements of a sequence that may be too short,
itertools.chain() and itertools.islice() are useful.
>>> import itertools
>>> vals1 = ['a', 'b']
>>> a, b, c = itertools.islice(itertools.chain(vals1, ['c']), 3)
>>> a, b, c
('a', 'b', 'c')
>>> vals2 = ['a', 'b', 'd']
>>> a, b, c = itertools.islice(itertools.chain(vals2, ['c']), 3)
>>> a, b, c
('a', 'b', 'd')
Doug
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstack.org/pipermail/openstack-dev/attachments/20130710/b7333105/attachment.html>
More information about the OpenStack-dev
mailing list