Files
SmartThings-Local/smartthings_local/errors.py
T

104 lines
2.7 KiB
Python

"""Public, redacted exception types for smartthings-local."""
__all__ = [
'AuthenticationError',
'AuthorizationError',
'BlockwiseError',
'EndpointError',
'MalformedMessageError',
'ObserveError',
'ProbeError',
'SessionClosedError',
'SessionError',
'SessionTimeoutError',
'SmartThingsLocalError',
]
class SmartThingsLocalError(Exception):
"""Base class for classified library failures.
Subclasses expose a stable ``code`` and a fixed, non-sensitive message.
They intentionally do not accept arbitrary detail because backend errors
can contain remote endpoints, local paths, or credential metadata.
"""
code = 'smartthings_local_error'
message = 'SmartThings Local operation failed'
def __init__(self):
super().__init__(self.message)
def __repr__(self):
return f'{type(self).__name__}(code={self.code!r})'
class EndpointError(SmartThingsLocalError, OSError):
"""An endpoint could not be resolved, bound, or connected."""
code = 'endpoint'
message = 'endpoint operation failed'
class ProbeError(SmartThingsLocalError, ConnectionError):
"""A DTLS probe failed before producing a protocol result."""
code = 'probe'
message = 'DTLS probe failed'
class SessionError(SmartThingsLocalError, ConnectionError):
"""A connected-session operation failed."""
code = 'session'
message = 'session operation failed'
class AuthenticationError(SessionError):
"""The peer or local credentials could not be authenticated."""
code = 'authentication'
message = 'authentication failed'
class AuthorizationError(SmartThingsLocalError, PermissionError):
"""The authenticated peer is not authorized for an operation."""
code = 'authorization'
message = 'operation is not authorized'
class SessionTimeoutError(SmartThingsLocalError, TimeoutError):
"""A bounded session operation exceeded its deadline."""
code = 'timeout'
message = 'session operation timed out'
class SessionClosedError(SessionError):
"""An operation was attempted on a closed session."""
code = 'session_closed'
message = 'session is closed'
class MalformedMessageError(SmartThingsLocalError, ValueError):
"""A protocol message could not be decoded safely."""
code = 'malformed_message'
message = 'malformed protocol message'
class BlockwiseError(SessionError):
"""A Block1 or Block2 transfer violated its bounded contract."""
code = 'blockwise'
message = 'blockwise transfer failed'
class ObserveError(SessionError):
"""A CoAP Observe relation could not be established or maintained."""
code = 'observe'
message = 'Observe relation failed'