From: Mike Bayer Date: Sat, 30 Jun 2007 17:05:27 +0000 (+0000) Subject: merged, with some modifications, mapped constructor exceptions fix from trunk 2825 X-Git-Tag: rel_0_4_6~150 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a426dde8c09af9b708e86dd5b822e61622b8bb5a;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git merged, with some modifications, mapped constructor exceptions fix from trunk 2825 --- diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index 8b0878688d..8c4a9c8a31 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -760,12 +760,11 @@ class Mapper(object): if oldinit is not None: try: oldinit(instance, *args, **kwargs) - except Exception, e: - try: - self.extension.init_failed(self, self.class_, instance, args, kwargs) - except: - pass # raise original exception instead - raise e + except: + # call init_failed but suppress exceptions into warnings so that original __init__ + # exception is raised + util.warn_exception(self.extension.init_failed, self, self.class_, instance, args, kwargs) + raise # override oldinit, ensuring that its not already a Mapper-decorated init method if oldinit is None or not hasattr(oldinit, '_oldinit'): diff --git a/lib/sqlalchemy/util.py b/lib/sqlalchemy/util.py index 9047d5c414..2e1c09c0e5 100644 --- a/lib/sqlalchemy/util.py +++ b/lib/sqlalchemy/util.py @@ -12,6 +12,7 @@ except ImportError: import md5 import sys +import warnings import __builtin__ try: @@ -157,6 +158,13 @@ def duck_type_collection(specimen, default=None): return dict else: return default + +def warn_exception(func, *args, **kwargs): + """executes the given function, catches all exceptions and converts to a warning.""" + try: + return func(*args, **kwargs) + except: + warnings.warn(RuntimeWarning("%s('%s') ignored" % sys.exc_info()[0:2])) class SimpleProperty(object): """A *default* property accessor.""" diff --git a/test/orm/mapper.py b/test/orm/mapper.py index 19a2e0a3c0..f5aa1f7e7a 100644 --- a/test/orm/mapper.py +++ b/test/orm/mapper.py @@ -145,15 +145,14 @@ class MapperTest(MapperSuperTest): except Exception, e: assert e is ex - class Bar(object): - def __init__(self): - object_session(self).expunge(self) - raise ex - - mapper(Bar, orders, extension=SessionContextExt(SessionContext())) + clear_mappers() + mapper(Foo, users, extension=SessionContextExt(SessionContext())) + def bad_expunge(foo): + raise Exception("this exception should be stated as a warning") + sess.expunge = bad_expunge try: - Bar(_sa_session=sess) + Foo(_sa_session=sess) assert False except Exception, e: assert e is ex