diff options
author | Justus Winter <4winter@informatik.uni-hamburg.de> | 2011-09-26 03:05:35 +0200 |
---|---|---|
committer | Sebastian Spaeth <Sebastian@SSpaeth.de> | 2011-09-30 13:58:03 +0200 |
commit | b6a01735d238733ef78f941a8b7c4bad59db2734 (patch) | |
tree | e3fc127dc19ad42c04564a5a674673cbf9038117 /bindings/python/notmuch/globals.py | |
parent | a378a91ba2db58608640cd58373565d653a7c4e6 (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.py | 54 |
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 |