[docs]class RLPException(Exception):
"""Base class for exceptions raised by this package."""
pass
[docs]class EncodingError(RLPException):
"""Exception raised if encoding fails.
:ivar obj: the object that could not be encoded
"""
def __init__(self, message, obj):
super(EncodingError, self).__init__(message)
self.obj = obj
[docs]class DecodingError(RLPException):
"""Exception raised if decoding fails.
:ivar rlp: the RLP string that could not be decoded
"""
def __init__(self, message, rlp):
super(DecodingError, self).__init__(message)
self.rlp = rlp
[docs]class SerializationError(RLPException):
"""Exception raised if serialization fails.
:ivar obj: the object that could not be serialized
"""
def __init__(self, message, obj):
super(SerializationError, self).__init__(message)
self.obj = obj
class ListSerializationError(SerializationError):
"""Exception raised if serialization by a :class:`sedes.List` fails.
:ivar element_exception: the exception that occurred during the serialization of one of the
elements, or `None` if the error is unrelated to a specific element
:ivar index: the index in the list that produced the error or `None` if the error is unrelated
to a specific element
"""
def __init__(self, message=None, obj=None, element_exception=None, index=None):
if message is None:
assert index is not None
assert element_exception is not None
message = ('Serialization failed because of element at index {} '
'("{}")'.format(index, str(element_exception)))
super(ListSerializationError, self).__init__(message, obj)
self.index = index
self.element_exception = element_exception
class ObjectSerializationError(SerializationError):
"""Exception raised if serialization of a :class:`sedes.Serializable` object fails.
:ivar sedes: the :class:`sedes.Serializable` that failed
:ivar list_exception: exception raised by the underlying list sedes, or `None` if no such
exception has been raised
:ivar field: name of the field of the object that produced the error, or `None` if no field
responsible for the error
"""
def __init__(self, message=None, obj=None, sedes=None, list_exception=None):
if message is None:
assert list_exception is not None
if list_exception.element_exception is None:
field = None
message = ('Serialization failed because of underlying list '
'("{}")'.format(str(list_exception)))
else:
assert sedes is not None
field = sedes.fields[list_exception.index][0]
message = ('Serialization failed because of field {} '
'("{}")'.format(field, str(list_exception.element_exception)))
else:
field = None
super(ObjectSerializationError, self).__init__(message, obj)
self.field = field
self.list_exception = list_exception
[docs]class DeserializationError(RLPException):
"""Exception raised if deserialization fails.
:ivar serial: the decoded RLP string that could not be deserialized
"""
def __init__(self, message, serial):
super(DeserializationError, self).__init__(message)
self.serial = serial
class ListDeserializationError(DeserializationError):
"""Exception raised if deserialization by a :class:`sedes.List` fails.
:ivar element_exception: the exception that occurred during the deserialization of one of the
elements, or `None` if the error is unrelated to a specific element
:ivar index: the index in the list that produced the error or `None` if the error is unrelated
to a specific element
"""
def __init__(self, message=None, serial=None, element_exception=None, index=None):
if not message:
assert index is not None
assert element_exception is not None
message = ('Deserialization failed because of element at index {} '
'("{}")'.format(index, str(element_exception)))
super(ListDeserializationError, self).__init__(message, serial)
self.index = index
self.element_exception = element_exception
class ObjectDeserializationError(DeserializationError):
"""Exception raised if deserialization by a :class:`sedes.Serializable` fails.
:ivar sedes: the :class:`sedes.Serializable` that failed
:ivar list_exception: exception raised by the underlying list sedes, or `None` if no such
exception has been raised
:ivar field: name of the field of the object that produced the error, or `None` if no field
responsible for the error
"""
def __init__(self, message=None, serial=None, sedes=None, list_exception=None):
if not message:
assert list_exception is not None
if list_exception.element_exception is None:
field = None
message = ('Deserialization failed because of underlying list '
'("{}")'.format(str(list_exception)))
else:
assert sedes is not None
field = sedes.fields[list_exception.index][0]
message = ('Deserialization failed because of field {} '
'("{}")'.format(field, str(list_exception.element_exception)))
super(ObjectDeserializationError, self).__init__(message, serial)
self.sedes = sedes
self.list_exception = list_exception
self.field = field