Subject: [Tutor] Re: Tutor Testing for response from a Web site
Jeff Shannon
jeff@ccvcorp.com
Thu Apr 10 12:47:01 2003
charlie@begeistert.org wrote:
>>3) Can this code be written so that I only need to have ONE
>> f_object.close() statement if any exception occurs? As it stands
>> now, I have to repeat it for each exception.
>>
>>
>Yes, you just add a finally: f_object.close() at the end.
>
[...]
>try:
># print "\nBEGIN DOWNLOADING ETA (MET) MOS"
> print "BEGIN DOWNLOADING ETA (MET) MOS"
># this is Python so we don't need more \n than absolutely necessary
> metall = urllib.urlopen(metURL).read()
> f_object.write(metall)
>except IOError:
> print "Server connection could not be made."
>except:
> print "Something has gone wrong"
> print sys.exc_info()
>finally:
> f_object.close()
>
>
This actually doesn't *quite* work. You can't have an 'except:' clause
and a 'finally:' clause hanging off the same 'try:'. You need to nest them:
try:
try:
print "Begin Downloading..."
metall = urllib.urlopen(metURL).read()
f_object.write(metall)
except IOError:
print "Server connection could not be made."
except:
print "Something has gone wrong."
print sys.exc_info()
finally:
f_object.close()
In this particular case, you don't really even need the 'finally',
because any possible exception is already being caught, so execution
will always continue. That might not be a good idea, though -- if
you're getting no connection, or if you're having other unspecified
errors, it might be best to go ahead and terminate the program, or
perhaps return from the function this is in and try it again in ten
minutes... In those cases, you could add a 'sys.exit(1)' or a
'return' to each except clause, the 'finally' will ensure that f_object
gets closed, and a successful download will leave execution continuing
just after the 'finally' while an exception would end execution (within
this scope).
Jeff Shannon
Technician/Programmer
Credit International