104 lines
2.7 KiB
Python
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'
|