Best way to handle exceptions with try/finally

bruno at modulix onurb at xiludom.gro
Wed May 24 08:41:28 EDT 2006


Carl J. Van Arsdall wrote:
(snip)

Not an answer to your question, just a few comments on your code:

> class Shared:

class Shared(object):


>        def __init__(self):
>                self.__userData= {}
>                self.__mutex = threading.Lock() #lock object

Don't use __names unless you have a *really* strong reason to do so.
'protected' attributes are usually noted as _name.

>        def getVar(self, variableName):
>                temp = None
>                error = 0
>                self.__mutex.acquire() #accessing shared dictionary
>                try:
>                        try:
>                                temp = self.__userData[variableName]
>                        except:

Don't use bare except clauses. Specify the exceptions you intend to
handle, let the other propagate.

I once spent many hours trying to debug a badly written module that has
such a catch-all clause with a misleading error message saying some file
could not be opened when the actual problem was with a wrong login/pass
for a connection.

>                                print "Variable doesn't exist in shared
> space"

stdout is for normal program outputs. Error messages should go to stderr.

>                                raise ValueError

Should be a LookupError subclass. And the message should go with the
exception:
  raise MyLookupErrorSubclass("Variable '%s' doesn't exist in shared
space" % variableName)


>                finally:
>                        self.__mutex.release()
>                        return temp
> 
>        def putVar(self, variableName, value):
>                self.__mutex.acquire() #accessing shared dictionary
>                try:
>                        self.__userData[variableName] = value
>                finally:
>                        self.__mutex.release()
>                        return

The return statement is useless here.

My 2 cents.
-- 
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'onurb at xiludom.gro'.split('@')])"



More information about the Python-list mailing list