Error Types Reference

View Source

Structured error types in BB. All errors implement the BB.Error.Severity protocol.

Severity Levels

LevelDescription
:criticalImmediate safety response required
:errorOperation failed, may retry or degrade
:warningUnusual condition, operation continues

Hardware Errors

Communication failures with physical devices.

Class: :hardware

BusError

Communication bus failure.

Module: BB.Error.Hardware.BusError

Fields:

FieldTypeDescription
busstringBus identifier (e.g., "i2c-1")
reasontermUnderlying error

Severity: :error

DeviceError

Device-level failure.

Module: BB.Error.Hardware.DeviceError

Fields:

FieldTypeDescription
devicetermDevice identifier
reasontermError details

Severity: :error

Disconnected

Device unexpectedly disconnected.

Module: BB.Error.Hardware.Disconnected

Fields:

FieldTypeDescription
devicetermDevice identifier

Severity: :error

Timeout

Hardware communication timeout.

Module: BB.Error.Hardware.Timeout

Fields:

FieldTypeDescription
devicetermDevice identifier
operationatomOperation that timed out

Severity: :error

Safety Errors

Safety system violations.

Class: :safety

All safety errors have severity :critical.

CollisionRisk

Collision detected or imminent.

Module: BB.Error.Safety.CollisionRisk

Fields:

FieldTypeDescription
linkatomLink at risk
obstacletermObstacle description

DisarmFailed

Disarm callback failed.

Module: BB.Error.Safety.DisarmFailed

Fields:

FieldTypeDescription
path[atom]Process path
reasontermFailure reason

EmergencyStop

Emergency stop triggered.

Module: BB.Error.Safety.EmergencyStop

Fields:

FieldTypeDescription
sourcetermWhat triggered the stop

LimitExceeded

Joint limit exceeded.

Module: BB.Error.Safety.LimitExceeded

Fields:

FieldTypeDescription
jointatomJoint name
limitatom:position, :velocity, or :effort
valuefloatActual value
maxfloatMaximum allowed

Kinematics Errors

Motion planning failures.

Class: :kinematics

NoDofs

No degrees of freedom available.

Module: BB.Error.Kinematics.NoDofs

Fields:

FieldTypeDescription
chain[atom]Kinematic chain

Severity: :error

NoSolution

Inverse kinematics found no solution.

Module: BB.Error.Kinematics.NoSolution

Fields:

FieldTypeDescription
targetTransformRequested pose
reasontermWhy no solution exists

Severity: :error

MultiFailed

Multiple IK attempts failed.

Module: BB.Error.Kinematics.MultiFailed

Fields:

FieldTypeDescription
attemptsintegerNumber of attempts
errors[term]Individual errors

Severity: :error

SelfCollision

Motion would cause self-collision.

Module: BB.Error.Kinematics.SelfCollision

Fields:

FieldTypeDescription
link_aatomFirst colliding link
link_batomSecond colliding link

Severity: :warning

Singularity

Near kinematic singularity.

Module: BB.Error.Kinematics.Singularity

Fields:

FieldTypeDescription
jointatomJoint near singularity
manipulabilityfloatManipulability measure

Severity: :warning

Referenced link not found.

Module: BB.Error.Kinematics.UnknownLink

Fields:

FieldTypeDescription
linkatomUnknown link name

Severity: :error

Unreachable

Target is outside workspace.

Module: BB.Error.Kinematics.Unreachable

Fields:

FieldTypeDescription
targetTransformRequested pose
distancefloatDistance outside workspace

Severity: :error

Invalid Errors

Configuration and validation errors.

Class: :invalid

Command

Invalid command definition.

Module: BB.Error.Invalid.Command

Fields:

FieldTypeDescription
commandatomCommand name
reasontermValidation failure

Severity: :error

JointConfig

Invalid joint configuration.

Module: BB.Error.Invalid.JointConfig

Fields:

FieldTypeDescription
jointatomJoint name
fieldatomInvalid field
reasontermWhy invalid

Severity: :error

Parameter

Invalid parameter value.

Module: BB.Error.Invalid.Parameter

Fields:

FieldTypeDescription
nameatomParameter name
valuetermInvalid value
expectedtermExpected type/range

Severity: :error

Topology

Invalid topology definition.

Module: BB.Error.Invalid.Topology

Fields:

FieldTypeDescription
path[atom]Location in topology
reasontermValidation failure

Severity: :error

State Errors

State machine violations.

Class: :state

NotAllowed

Command not allowed in current state.

Module: BB.Error.State.NotAllowed

Fields:

FieldTypeDescription
current_stateatomCurrent robot state
allowed_states[atom]States where command is allowed

Severity: :error

Invalid

Invalid state transition.

Module: BB.Error.State.Invalid

Fields:

FieldTypeDescription
fromatomCurrent state
toatomRequested state

Severity: :error

Preempted

Command was preempted by another.

Module: BB.Error.State.Preempted

Fields:

FieldTypeDescription
commandatomOriginal command
preempted_byatomPreempting command

Severity: :warning

Timeout

Command execution timeout.

Module: BB.Error.State.Timeout

Fields:

FieldTypeDescription
commandatomCommand that timed out
elapsedintegerTime elapsed (ms)

Severity: :error

CommandCrashed

Command process crashed.

Module: BB.Error.State.CommandCrashed

Fields:

FieldTypeDescription
commandatomCommand that crashed
reasontermCrash reason

Severity: :error

Category Errors

Command category errors.

Class: :category

Full

Command category is at capacity.

Module: BB.Error.Category.Full

Fields:

FieldTypeDescription
categoryatomCategory name
capacityintegerMaximum concurrent commands
runningintegerCurrently running

Severity: :error

Protocol Errors

Low-level protocol failures.

Class: :protocol

Used by driver packages (e.g., Robotis Dynamixel protocol errors).

Creating Errors

Always use exception/1 to create errors so that Splode can capture backtraces:

# Create error with exception/1 (captures backtrace)
error = BB.Error.State.NotAllowed.exception(
  current_state: :disarmed,
  allowed_states: [:idle]
)

# Check severity
BB.Error.Severity.severity(error)  #=> :error

# Get message
BB.Error.message(error)  #=> "Command not allowed in state :disarmed..."

Do not create error structs directly - this bypasses Splode's backtrace capture:

# Avoid - no backtrace captured
error = %BB.Error.State.NotAllowed{
  current_state: :disarmed,
  allowed_states: [:idle]
}

Returning Errors

Prefer structured errors over tuples:

# Good - use exception/1
{:error, BB.Error.State.NotAllowed.exception(current_state: :disarmed, allowed_states: [:idle])}

# Avoid - tuple-based errors
{:error, {:not_allowed, :disarmed}}