Exceptions
========================

.. py:currentmodule:: sdbus.exceptions

Error name bound exceptions
+++++++++++++++++++++++++++++++

These exceptions are bound to specific D-Bus error names. For example,
:py:exc:`DbusFailedError` is bound to `org.freedesktop.DBus.Error.Failed`
error name.

This means if the remote object sends an error message with this error name
the Python will receive this exception.

When raised in a method callback an error message will be sent
back to caller.

See `list of error exceptions`_.

New error bound exceptions
+++++++++++++++++++++++++++++++

If you want to create a new error bound exception you should subclass
it from :py:exc:`DbusFailedError` and provide a **unique** ``dbus_error_name``
attribute in the exception body definition.

Example: ::

    class DbusExampleError(DbusFailedError):
        dbus_error_name = 'org.example.Error'


If ``dbus_error_name`` is not unique the :py:exc:`ValueError` will be raised.

Defining an exception will automatically bind incoming error message to this
new exception.

Existing exceptions can be manually binded using :py:func:`map_exception_to_dbus_error`
function.

Python built-in exceptions
+++++++++++++++++++++++++++

All Python built-in exceptions are mapped to D-Bus errors.

The D-Bus error name is created by appending ``org.python.Error.``
to the exception name.

For example, ``AssertionError`` is bound
to ``org.python.Error.AssertionError`` name.

Functions
+++++++++

.. py:function:: map_exception_to_dbus_error(exception, dbus_error_name)

    Map exception to a D-bus error. Error name must be unique.

    :param Type[Exception] exception: Exception to bind.
    :param str dbus_error_name: D-Bus error name to bind to.


Other exceptions
+++++++++++++++++++++++++

.. py:exception:: SdBusBaseError

    Base exceptions for all exceptions defined in sdbus.

.. py:exception:: SdBusUnmappedMessageError

    Message error that is unmapped.

    The exceptions argument is a tuple of
    error name and error message. 

.. py:exception:: SdBusLibraryError

    sd-bus library returned error.

    Exception message contains line number and the error name.


.. _name-request-exceptions:

Name request exceptions
+++++++++++++++++++++++

These exceptions will be raise if an error related to ownership of D-Bus
names occurs when calling :py:func:`.request_default_bus_name_async` or
:py:func:`.request_default_bus_name`.

.. py:exception:: SdBusRequestNameError

    Common base exception for any name ownership error.

.. py:exception:: SdBusRequestNameInQueueError

    Someone already owns the name but the request has been placed in queue.

.. py:exception:: SdBusRequestNameExistsError

    Someone already owns the name.

.. py:exception:: SdBusRequestNameAlreadyOwnerError

    The caller already owns the name.


.. _list of error exceptions:

Error name exception list
++++++++++++++++++++++++++++++

.. py:exception:: DbusFailedError

    Generic failure exception.

    Recommended to subclass to create a new exception.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.Failed

.. py:exception:: DbusNoMemoryError

    Remote object is out of memory.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.NoMemory

.. py:exception:: DbusServiceUnknownError

    No service with such name exists.

    Probably should only be raised by bus daemon.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.ServiceUnknown

.. py:exception:: DbusNameHasNoOwnerError

    No process owns the name you called.

    Probably should only be raised by bus daemon.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.NameHasNoOwner

.. py:exception:: DbusNoReplyError

    Timeout on reply.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.NoReply

.. py:exception:: DbusIOError

    Input/Output error.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.IOError

.. py:exception:: DbusBadAddressError

    Bad address.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.BadAddress

.. py:exception:: DbusNotSupportedError

    Something is unsupported on this platform.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.NotSupported

.. py:exception:: DbusLimitsExceededError

    Some resource was exhausted. (for example, file descriptors)

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.LimitsExceeded

.. py:exception:: DbusAccessDeniedError

    Caller does not have enough privileges.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.AccessDenied

.. py:exception:: DbusAuthFailedError

    Authentication failed.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.AuthFailed

.. py:exception:: DbusNoServerError

    Unable to connect to bus.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.NoServer

.. py:exception:: DbusTimeoutError

    Socket timeout.

    This is different from :py:exc:`DbusNoReplyError` as here the
    connection to bus timeout not the remote object not replying.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.Timeout

.. py:exception:: DbusNoNetworkError

    No network access.

    Encountered you use D-Bus over TCP or SSH.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.NoNetwork

.. py:exception:: DbusAddressInUseError

    Address in use.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.AddressInUse

.. py:exception:: DbusDisconnectedError

    Disconnected from bus.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.Disconnected

.. py:exception:: DbusInvalidArgsError

    Method call args are invalid.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.InvalidArgs

.. py:exception:: DbusFileNotFoundError

    File not found.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.FileNotFound

.. py:exception:: DbusFileExistsError

    Generic failure exception.

    Recommended to subclass to create a new exception.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.FileExists

.. py:exception:: DbusUnknownMethodError

    Unknown D-Bus method.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.UnknownMethod

.. py:exception:: DbusUnknownObjectError

    Unknown D-Bus object.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.UnknownObject

.. py:exception:: DbusUnknownInterfaceError

    Unknown D-Bus interface.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.UnknownInterface

.. py:exception:: DbusUnknownPropertyError

    Unknown D-Bus property.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.UnknownProperty

.. py:exception:: DbusPropertyReadOnlyError

    D-Bus property is read only.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.PropertyReadOnly

.. py:exception:: DbusUnixProcessIdUnknownError

    PID does not exists.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.UnixProcessIdUnknown

.. py:exception:: DbusInvalidSignatureError

    Invalid D-Bus type signature.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.InvalidSignature

.. py:exception:: DbusInvalidFileContentError

    Invalid file content.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.InvalidFileContent

.. py:exception:: DbusInconsistentMessageError

    D-Bus message is malformed.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.InconsistentMessage

.. py:exception:: DbusMatchRuleNotFound

    Match rule does not exist.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.MatchRuleNotFound

.. py:exception:: DbusMatchRuleInvalidError

    Match rule is invalid.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.MatchRuleInvalid

.. py:exception:: DbusInteractiveAuthorizationRequiredError

    Requires interactive authorization.

    .. py:attribute:: dbus_error_name
        :type: str
        :value: org.freedesktop.DBus.Error.InteractiveAuthorizationRequired
