diff options
author | Sebastian Spaeth <Sebastian@SSpaeth.de> | 2011-09-30 16:04:42 +0200 |
---|---|---|
committer | Sebastian Spaeth <Sebastian@SSpaeth.de> | 2011-09-30 16:04:42 +0200 |
commit | 8c51525e8213e074a845ad53d7196453952623dd (patch) | |
tree | 41a5ff444b2c532aec8c5a64b03be9a3ca496600 /bindings/python/notmuch/globals.py | |
parent | b6a01735d238733ef78f941a8b7c4bad59db2734 (diff) |
python: rework creating of Subclasses
Add some smart magic, so that when we invoke a
NotmuchError(STATUSVALUE), a nicely derived subclass is created, e.g. a
OutOfMemoryError. This way users can easily distinguish between error
types, while still catching NotmuchError.
I have tested this, and hope it works for others too.
Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
Diffstat (limited to 'bindings/python/notmuch/globals.py')
-rw-r--r-- | bindings/python/notmuch/globals.py | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/bindings/python/notmuch/globals.py b/bindings/python/notmuch/globals.py index 5fca3d9b..190854a1 100644 --- a/bindings/python/notmuch/globals.py +++ b/bindings/python/notmuch/globals.py @@ -96,7 +96,7 @@ class NotmuchError(Exception): but SUCCESS has a corresponding subclassed Exception.""" @classmethod - def get_subclass_exc(cls, status, message=None): + def get_exc_subclass(cls, status): """Returns a fine grained Exception() type,detailing the error status""" subclasses = { STATUS.OUT_OF_MEMORY: OutOfMemoryError, @@ -112,9 +112,23 @@ class NotmuchError(Exception): STATUS.NOT_INITIALIZED: NotInitializedError } assert 0 < status <= len(subclasses) - return subclasses[status](status, message) - - def __init__(self, status, message=None): + return subclasses[status] + + def __new__(cls, *args, **kwargs): + """Return a correct subclass of NotmuchError if needed + + We return a NotmuchError instance if status is None (or 0) and a + subclass that inherits from NotmuchError depending on the + 'status' parameter otherwise.""" + # get 'status'. Passed in as arg or kwarg? + status = args[0] if len(args) else kwargs.get('status', None) + # no 'status' or cls is subclass already, return 'cls' instance + if not status or cls != NotmuchError: + return super(NotmuchError, cls).__new__(cls) + subclass = cls.get_exc_subclass(status) # which class to use? + return subclass.__new__(subclass, *args, **kwargs) + + def __init__(self, status=None, message=None): self.status = status self.message = message @@ -127,7 +141,7 @@ class NotmuchError(Exception): return 'Unknown error' # List of Subclassed exceptions that correspond to STATUS values and are -# subclasses of NotmuchError: +# subclasses of NotmuchError. class OutOfMemoryError(NotmuchError): pass class ReadOnlyDatabaseError(NotmuchError): |