retry in exception

Tim Chase python.list at tim.thechases.com
Fri Sep 29 15:25:14 EDT 2006


> In ruby, the equivalent to try...except is begin...rescue. In the
> rescue section you can ask it to retry the begin section. So, for
> example:
> 
> b=0
> begin
>   puts 1/b
> rescue
>   b=1
>   retry # <- this little guy
> end


Well, it's all a matter of how you look at it.  I personally 
prefer to see that there's some sort of looping going on. 
Something crazy like this contrived example, it would be best to 
just check to see if b==0 beforehand.  However, for the sake of 
example, one could do something like

b = 0

for d in [b, 1]:
	try:
		print 1/d
		break
	except ZeroDivisionError:
		pass


which would allow you to have a number of things to try...to give 
a little more plausibility to the idea, the original ruby might 
have been something like (forgive my ignorance of ruby syntax)

url = 'http://www.example.com'
begin
   get_webpage(url)
rescue
   url = 'http://www2.example.com'
   retry
end


which would try a backup server if the main one is down.  The 
above python variant would allow an arbitrary number of servers 
to be listed

servers = ['http://www%i.example.com' % i for i in xrange(1,5)]
for server in servers:
	try:
		u = urllib.urlopen(server)
		break
	except IOError:
		pass
else:
	raise NoAvailableServersException()

This comes full-circle on another thread asking about the use of 
"else:" after a for/while loop...yes, nice to have.

The above python code will try to open each of the servers in 
turn until it gets one that it can open.  If it can't open any of 
them, it raises some concocted NoAvailableServersException.  To 
get the above to succeed, you can add

servers[3] = 'http://www.example.com'

which will actually exist, and thus will fall out of the loop 
with "u" successfully set to the connection from which you can read.

I have to agree with Diez, that this sounds like some 
ambiguous/dangerous behaviour could ensue from such a language 
construct.  I'd just as soon specify my desired behavior explicitly.

Just a few ideas.

-tkc







More information about the Python-list mailing list