aboutsummaryrefslogtreecommitdiffhomepage
path: root/bindings/python/notmuch/globals.py
diff options
context:
space:
mode:
authorGravatar Sebastian Spaeth <Sebastian@SSpaeth.de>2011-09-30 16:04:42 +0200
committerGravatar Sebastian Spaeth <Sebastian@SSpaeth.de>2011-09-30 16:04:42 +0200
commit8c51525e8213e074a845ad53d7196453952623dd (patch)
tree41a5ff444b2c532aec8c5a64b03be9a3ca496600 /bindings/python/notmuch/globals.py
parentb6a01735d238733ef78f941a8b7c4bad59db2734 (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.py24
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):