Syntactic structure for 'until <Exception>:' loop

Ian Kelly ian.g.kelly at gmail.com
Tue Jan 11 21:53:19 EST 2011


On 1/11/2011 7:22 PM, eblume wrote:
> This would be exactly equivalent to (but much more compact than):
>
> while True:
>      try:
>          do_something()
>      except Exception:
>          break

Or perhaps:

try:
     while True:
         do_something()
except Exception:
     pass

> Now, why would anyone want this structure? In my case, I'm using it
> (well, the latter form of it, obviously) to loop over an iterator
> object that was not created via the 'for obj in collection:' syntax.
> Here's the actual code snippet:
>
>                  headers = self.reader.next()
>                  ... intermediate code ....
>                  while True:
>                          try:
>                                  line = self.reader.next()
>                          except StopIteration:
>                                  return data
>                          data.append(line)
>
> I'm sure I'm doing this in a very backward and wrong way, and would
> appreciate tips on a better way to accomplish the same task. Obviously
> there is an existing syntax which handles the same situations, and I
> don't suspect that this will be an embraced proposal, I'm more hoping
> to spark some conversation.


reader_iter = iter(self.reader)
headers = reader_iter.next()
# intermediate code
for line in reader_iter:
     data.append(line)
return data


Also note that recommended best practice is to wrap the "headers = 
reader_iter.next()" line in a try-except in case it raises a 
StopIteration.  Otherwise it could get propagated silently up to some 
unrelated for loop higher in the stack, resulting in unexpected behavior.

Cheers,
Ian




More information about the Python-list mailing list