aboutsummaryrefslogtreecommitdiff
path: root/bindings/python/notmuch/globals.py
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2011-09-26 03:05:35 +0200
committerSebastian Spaeth <Sebastian@SSpaeth.de>2011-09-30 13:58:03 +0200
commitb6a01735d238733ef78f941a8b7c4bad59db2734 (patch)
treee3fc127dc19ad42c04564a5a674673cbf9038117 /bindings/python/notmuch/globals.py
parenta378a91ba2db58608640cd58373565d653a7c4e6 (diff)
python: provide more exception classes
To make the exception handling more effective in code using the python bindings it is necessary to differentiate between the different kind of failures. Add an exception class for each status code and add a decode classmethod to the NotmuchError class that acts as a factory. Import the new classes in __init__.py so they can be easily imported by anyone. Patch modifed by Sebastian Spaeth. Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de> Signed-off-by: Justus Winter <4winter@informatik.uni-hamburg.de>
Diffstat (limited to 'bindings/python/notmuch/globals.py')
-rw-r--r--bindings/python/notmuch/globals.py54
1 files changed, 51 insertions, 3 deletions
diff --git a/bindings/python/notmuch/globals.py b/bindings/python/notmuch/globals.py
index 097ab96..5fca3d9 100644
--- a/bindings/python/notmuch/globals.py
+++ b/bindings/python/notmuch/globals.py
@@ -89,10 +89,32 @@ Invoke the class method `notmuch.STATUS.status2str` with a status value as
argument to receive a human readable string"""
STATUS.__name__ = 'STATUS'
-
class NotmuchError(Exception):
- def __init__(self, status=None, message=None):
- """Is initiated with a (notmuch.STATUS[,message=None])"""
+ """Is initiated with a (notmuch.STATUS[, message=None]). It will not
+ return an instance of the class NotmuchError, but a derived instance
+ of a more specific Error Message, e.g. OutOfMemoryError. Each status
+ but SUCCESS has a corresponding subclassed Exception."""
+
+ @classmethod
+ def get_subclass_exc(cls, status, message=None):
+ """Returns a fine grained Exception() type,detailing the error status"""
+ subclasses = {
+ STATUS.OUT_OF_MEMORY: OutOfMemoryError,
+ STATUS.READ_ONLY_DATABASE: ReadOnlyDatabaseError,
+ STATUS.XAPIAN_EXCEPTION: XapianError,
+ STATUS.FILE_ERROR: FileError,
+ STATUS.FILE_NOT_EMAIL: FileNotEmailError,
+ STATUS.DUPLICATE_MESSAGE_ID: DuplicateMessageIdError,
+ STATUS.NULL_POINTER: NullPointerError,
+ STATUS.TAG_TOO_LONG: TagTooLongError,
+ STATUS.UNBALANCED_FREEZE_THAW: UnbalancedFreezeThawError,
+ STATUS.UNBALANCED_ATOMIC: UnbalancedAtomicError,
+ STATUS.NOT_INITIALIZED: NotInitializedError
+ }
+ assert 0 < status <= len(subclasses)
+ return subclasses[status](status, message)
+
+ def __init__(self, status, message=None):
self.status = status
self.message = message
@@ -104,6 +126,32 @@ class NotmuchError(Exception):
else:
return 'Unknown error'
+# List of Subclassed exceptions that correspond to STATUS values and are
+# subclasses of NotmuchError:
+class OutOfMemoryError(NotmuchError):
+ pass
+class ReadOnlyDatabaseError(NotmuchError):
+ pass
+class XapianError(NotmuchError):
+ pass
+class FileError(NotmuchError):
+ pass
+class FileNotEmailError(NotmuchError):
+ pass
+class DuplicateMessageIdError(NotmuchError):
+ pass
+class NullPointerError(NotmuchError):
+ pass
+class TagTooLongError(NotmuchError):
+ pass
+class UnbalancedFreezeThawError(NotmuchError):
+ pass
+class UnbalancedAtomicError(NotmuchError):
+ pass
+class NotInitializedError(NotmuchError):
+ pass
+
+
def _str(value):
"""Ensure a nicely utf-8 encoded string to pass to libnotmuch