Handling an connection error with Twython
Cecil Westerhof
Cecil at decebal.nl
Sat May 25 07:46:40 EDT 2019
MRAB <python at mrabarnett.plus.com> writes:
> On 2019-05-24 09:25, Cecil Westerhof wrote:
>> Dennis Lee Bieber <wlfraed at ix.netcom.com> writes:
>>
>>> On Fri, 24 May 2019 07:49:23 +0200, Cecil Westerhof <Cecil at decebal.nl>
>>> declaimed the following:
>>>
>>>>
>>>>I did not do that consciously, because I have to try until it is
>>>>successful an I return, or I reached the max tries and re-raise the
>>>>exception. With a for loop I could exit the loop and cannot re-raise
>>>>the exception.
>>>
>>> Your /success/ branch exits the loop by executing a "return" statement.
>>>
>>> Your /fail/ branch exits the loop by "raise" on the third failure.
>>>
>>> A "for" loop would have the same behavior; you just replace the manual
>>> initialization and increment of the loop counter.
>>>
>>> for tries in range(max_try):
>>> try:
>>> do something
>>> return successful
>>> except stuff:
>>> if tries+1 == max_try: #since range is 0..max_try-1
>>> raise
>>>
>>> You never "fall off the end" of the loop.
>>
>> That is true, but by using a 'while True:' loop it is clear you never
>> fall off the end of the loop. I find this much clearer. And when there
>> is a bug you get into an endless loop instead of fall of the end.
>> Which in my opinion is easier to spot and mend. And endless loop is
>> noticed the moment it goes wrong. Falling of the end could go without
>> an error and will be spotted much later.
>>
> You could print a message or raise an exception after the 'for' loop so
> that if it ever falls off the end of the loop you'll get a nice message
> instead of it just looping forever! :-)
>
Just changing the while loop to a for loop did not make sense to me,
but this does. I now have:
max_tries = 5
for current_try in range(1, max_tries):
try:
posted = twitter.update_status(status = message,
in_reply_to_status_id = message_id,
trim_user = True)
return posted['id']
except TwythonError as e:
if not 'Temporary failure in name resolution' in e.msg:
raise
timed_message('Failed on try: {0} of {1}'.format(current_try, max_tries))
if current_try == max_tries:
print('Could not get a connection to the internet: exiting')
deinit(2)
time.sleep(60)
raise RuntimeError('Should not get here')
When I do not get an internet connection, I do not do a re-raise
anymore, but just give a message.
The proc deinit does a sys.exit after some cleanup.
--
Cecil Westerhof
Senior Software Engineer
LinkedIn: http://www.linkedin.com/in/cecilwesterhof
More information about the Python-list
mailing list