vdirsyncer/vdirsyncer/exceptions.py
2016-06-10 00:15:37 +02:00

81 lines
1.8 KiB
Python

# -*- coding: utf-8 -*-
'''
Contains exception classes used by vdirsyncer. Not all exceptions are here,
only the most commonly used ones.
'''
class Error(Exception):
'''Baseclass for all errors.'''
def __init__(self, *args, **kwargs):
for key, value in kwargs.items():
if getattr(self, key, object()) is not None: # pragma: no cover
raise TypeError('Invalid argument: {}'.format(key))
setattr(self, key, value)
super(Error, self).__init__(*args)
class UserError(Error, ValueError):
'''Wrapper exception to be used to signify the traceback should not be
shown to the user.'''
problems = None
def __str__(self):
msg = Error.__str__(self)
for problem in self.problems or ():
msg += u'\n - {}'.format(problem)
return msg
class CollectionNotFound(Error):
'''Collection not found'''
class PairNotFound(Error):
'''Pair not found'''
pair_name = None
class PreconditionFailed(Error):
'''
- The item doesn't exist although it should
- The item exists although it shouldn't
- The etags don't match.
Due to CalDAV we can't actually say which error it is.
This error may indicate race conditions.
'''
class NotFoundError(PreconditionFailed):
'''Item not found'''
class AlreadyExistingError(PreconditionFailed):
'''Item already exists.'''
existing_href = None
class WrongEtagError(PreconditionFailed):
'''Wrong etag'''
class ReadOnlyError(Error):
'''Storage is read-only.'''
class InvalidResponse(Error, ValueError):
'''The backend returned an invalid result.'''
class UnsupportedMetadataError(Error, NotImplementedError):
'''The storage doesn't support this type of metadata.'''
class CollectionRequired(Error):
'''`collection = null` is not allowed.'''