Skip to content
Back to top
View this page

# Error Handling

There are several specific `Exception` classes to allow user code to react to specific scenarios related to CAN buses:

    Exception (Python standard library)
     +-- ...
     +-- CanError (python-can)
         +-- CanInterfaceNotImplementedError
         +-- CanInitializationError
         +-- CanOperationError
         +-- CanTimeoutError

Keep in mind that some functions and methods may raise different exceptions. For example, validating typical arguments and parameters might result in a `ValueError`. This should always be documented for the function at hand.

exception can.exceptions.CanError(message='', error_code=None)

  Bases: `Exception`

  Base class for all CAN related exceptions.

  If specified, the error code is automatically appended to the message:

      >>> # With an error code (it also works with a specific error):
      >>> error = CanOperationError(message="Failed to do the thing", error_code=42)
      >>> str(error)
      'Failed to do the thing [Error Code 42]'
      >>>
      >>> # Missing the error code:
      >>> plain_error = CanError(message="Something went wrong ...")
      >>> str(plain_error)
      'Something went wrong ...'

  Parameters:

    - error_code (int | None) – An optional error code to narrow down the cause of the fault

    - error_code – An optional error code to narrow down the cause of the fault

    - message (str)

  Return type:

    None

exception can.exceptions.CanInitializationError(message='', error_code=None)

  Bases: `CanError`

  Indicates an error the occurred while initializing a `can.BusABC`.

  If initialization fails due to a driver or platform missing/being unsupported, a `CanInterfaceNotImplementedError` is raised instead. If initialization fails due to a value being out of range, a `ValueError` is raised.

  Example scenarios:

    - Try to open a non-existent device and/or channel

    - Try to use an invalid setting, which is ok by value, but not ok for the interface

    - The device or other resources are already used

  Parameters:

    - message (str)

    - error_code (int | None)

  Return type:

    None

exception can.exceptions.CanInterfaceNotImplementedError(message='', error_code=None)

  Bases: `CanError`, `NotImplementedError`

  Indicates that the interface is not supported on the current platform.

  Example scenarios:

    - No interface with that name exists

    - The interface is unsupported on the current operating system or interpreter

    - The driver could not be found or has the wrong version

  Parameters:

    - message (str)

    - error_code (int | None)

  Return type:

    None

exception can.exceptions.CanOperationError(message='', error_code=None)

  Bases: `CanError`

  Indicates an error while in operation.

  Example scenarios:

    - A call to a library function results in an unexpected return value

    - An invalid message was received

    - The driver rejected a message that was meant to be sent

    - Cyclic redundancy check (CRC) failed

    - A message remained unacknowledged

    - A buffer is full

  Parameters:

    - message (str)

    - error_code (int | None)

  Return type:

    None

exception can.exceptions.CanTimeoutError(message='', error_code=None)

  Bases: `CanError`, `TimeoutError`

  Indicates the timeout of an operation.

  Example scenarios:

    - Some message could not be sent after the timeout elapsed

    - No message was read within the given time

  Parameters:

    - message (str)

    - error_code (int | None)

  Return type:

    None

can.exceptions.error_check(error_message=None, exception_type=<class 'can.exceptions.CanOperationError'>)

  Catches any exceptions and turns them into the new type while preserving the stack trace.

  Parameters:

    - error_message (str | None)

    - exception_type (type[CanError])

  Return type:

    Generator[None, None, None]