[DB-SIG] Unifying exceptions
M.-A. Lemburg
mal at egenix.com
Tue Aug 24 12:42:14 CEST 2004
Ian Bicking wrote:
> There might be a clever/tricky solution that would be a little easier to
> implement and more reliable.
>
> Hmm... you could try changing the exceptions, like:
>
> import psycopg
> psycopg.DatabaseError = MyDatabaseError
>
> I don't know if this will always stick, or if it's always mutable in
> this way. Another way might be:
>
> class MyDatabaseError(Exception):
> pass
> psycopg.DatabaseError.__bases__ = (MyDatabaseError,)
>
> Then you can catch MyDatabaseError, and it will catch
> psycopg.DatabaseError (since it's a subclass). This might be more
> likely to stick, and work better with the C modules. (Maybe, I don't
> know...?)
The way I usually cope with this is to bind the module exceptions
to the connection abstraction:
# Assure that self.Error catches all database related errors.
if hasattr(module, 'Error'):
Error = module.Error
elif hasattr(module, 'error'):
Error = module.error
else:
Error = exceptions.StandardError
self.Error = Error
# Localize available common constants for database independence
for symbol in ('InterfaceError',
'InternalError',
'OperationalError',
'Warning',
'ProgrammingError',
'IntegrityError',
'DataError',
'NotSupportedError',
):
obj = getattr(module, symbol, NotGiven)
if obj is not NotGiven:
setattr(self, symbol, obj)
elif symbol[-5:] == 'Error' or \
symbol[-7:] == 'Warning':
# All DB-API 2 error classes should be available for
# compatibility reasons
setattr(self, symbol, Error)
Works great (and is compatible to the DB API 2.0 extension
for connection objects).
--
Marc-Andre Lemburg
eGenix.com
Professional Python Services directly from the Source (#1, Aug 24 2004)
>>> Python/Zope Consulting and Support ... http://www.egenix.com/
>>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/
>>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/
________________________________________________________________________
::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! ::::
More information about the DB-SIG
mailing list