IOError and Try Again to loop the loop.
Chris Rebert
clp2 at rebertia.com
Mon Jul 12 00:34:35 EDT 2010
> On Jul 12, 2:14 pm, Chris Rebert <c... at rebertia.com> wrote:
>> On Sun, Jul 11, 2010 at 8:13 PM, The Danny Bos <danny... at gmail.com> wrote:
>> > Thanks gang,
>> > I'm gonna paste what I've put together, doesn't seem right. Am I way
>> > off?
>>
>> > Here's my code.
>> > - It goes through a table Item
>> > - Matches that Item ID to an API call
>> > - Grabs the data, saves it and creates the thumbnail
>> > - It dies due to Timeouts and Other baloney, all silly, nothing code
>> > based.
>>
>> > items = Item.objects.all().filter(cover='').order_by('-reference_id')
>> > for item in items:
>> > url = "http://someaddress.org/books/?issue=%s" % item.reference_id
>>
>> > url_array = []
>> > url_open = urllib.urlopen(url)
>> > url_read = url_open.read().decode('utf-8')
>>
>> > try:
>> > url_data = simplejson.loads(url_read)
>> > url_array.append(url_data)
>>
>> > for detail in url_array:
>>
>> Unless I'm missing something, there's no need for url_array to exist
>> at all. It starts out empty, you append url_data to it, then you
>> iterate over it as `detail`; and you don't touch it anywhere else in
>> the loop. Just s/detail/url_data/ and excise url_array altogether. As
>> a bonus, there'll be one less level of indentation.
>>
>> Also, the reason your code doesn't work (currently, it just skips to
>> the next item upon error) is because you're missing a surrounding
>> `while True` loop (and associated embedded `break`) to do the retrying
>> (see my or MRAB's examples).
>>
>> Additionally, stylistically I'd prefer the try-excepts to cover
>> smaller and more targeted areas of the code, rather than having one
>> giant blanket one for the entire loop body; perhaps that's just me
>> though.
On Sun, Jul 11, 2010 at 9:20 PM, The Danny Bos <dannybos at gmail.com> wrote:
> Thanks Chris,
>
> Agreed some of the code is a lot useless, I need to go through that
> stuff.
> So something like this (apologies for asking for some details, I'm not
> good at catching):
>
> items = Item.objects.all().filter(cover='').order_by('-reference_id')
> for item in items:
> url = "http://someaddress.org/books/?issue=%s" %
> item.reference_id
> url_array = []
> url_open = urllib.urlopen(url)
> url_read = url_open.read().decode('utf-8')
>
> while True:
> try:
<snip lots of code>
> break
> except ValueError:
> print "Error Processing record: %s: %s" %
> (item.reference_id, url)
> pass
> except IOError:
> print "IOError; Retrying..."
> pass
>
> print "Done"
Yes, correct, that's essentially it, although the `pass` statements
are superfluous, and I would personally put the `break` in a
separate+new else-clause of the try-except for clarity; so the
try-except part of the code would look like:
try:
# lots of code here
except ValueError:
print "Error Processing record: %s: %s" % (item.reference_id, url)
except IOError:
print "IOError; Retrying..."
else:
break
Also, please avoid top-posting in the future;
http://en.wikipedia.org/wiki/Top-posting#Top-posting
Cheers,
Chris
--
http://blog.rebertia.com
More information about the Python-list
mailing list