summaryrefslogtreecommitdiff
path: root/fastimport/errors.py
diff options
context:
space:
mode:
Diffstat (limited to 'fastimport/errors.py')
-rw-r--r--fastimport/errors.py63
1 files changed, 59 insertions, 4 deletions
diff --git a/fastimport/errors.py b/fastimport/errors.py
index 9a71d77..f2d5d88 100644
--- a/fastimport/errors.py
+++ b/fastimport/errors.py
@@ -16,18 +16,73 @@
"""Exception classes for fastimport"""
-from bzrlib import errors as bzr_errors
-
-
# Prefix to messages to show location information
_LOCATION_FMT = "line %(lineno)d: "
+# ImportError is heavily based on BzrError
-class ImportError(bzr_errors.BzrError):
+class ImportError(StandardError):
"""The base exception class for all import processing exceptions."""
_fmt = "Unknown Import Error"
+ def __init__(self, msg=None, **kwds):
+ StandardError.__init__(self)
+ if msg is not None:
+ self._preformatted_string = msg
+ else:
+ self._preformatted_string = None
+ for key, value in kwds.items():
+ setattr(self, key, value)
+
+ def _format(self):
+ s = getattr(self, '_preformatted_string', None)
+ if s is not None:
+ # contains a preformatted message
+ return s
+ try:
+ fmt = self._fmt
+ if fmt:
+ d = dict(self.__dict__)
+ s = fmt % d
+ # __str__() should always return a 'str' object
+ # never a 'unicode' object.
+ return s
+ except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
+ return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
+ % (self.__class__.__name__,
+ self.__dict__,
+ getattr(self, '_fmt', None),
+ e)
+
+ def __unicode__(self):
+ u = self._format()
+ if isinstance(u, str):
+ # Try decoding the str using the default encoding.
+ u = unicode(u)
+ elif not isinstance(u, unicode):
+ # Try to make a unicode object from it, because __unicode__ must
+ # return a unicode object.
+ u = unicode(u)
+ return u
+
+ def __str__(self):
+ s = self._format()
+ if isinstance(s, unicode):
+ s = s.encode('utf8')
+ else:
+ # __str__ must return a str.
+ s = str(s)
+ return s
+
+ def __repr__(self):
+ return '%s(%s)' % (self.__class__.__name__, str(self))
+
+ def __eq__(self, other):
+ if self.__class__ is not other.__class__:
+ return NotImplemented
+ return self.__dict__ == other.__dict__
+
class ParsingError(ImportError):
"""The base exception class for all import processing exceptions."""