17#ifndef IOX_HOOFS_ERROR_HANDLING_ERROR_HANDLING_HPP
18#define IOX_HOOFS_ERROR_HANDLING_ERROR_HANDLING_HPP
20#include "iceoryx_hoofs/cxx/generic_raii.hpp"
21#include "iceoryx_hoofs/cxx/vector.hpp"
31#define ICEORYX_ERRORS(error) \
33 error(FILEREADER__FAILED_TO_OPEN_FILE) \
34 error(POSH__ROUDI_PROCESS_SHUTDOWN_FAILED) \
35 error(POSH__ROUDI_PROCESS_SEND_VIA_IPC_CHANNEL_FAILED)\
36 error(POSH__RUNTIME_FACTORY_IS_NOT_SET) \
37 error(POSH__RUNTIME_IS_CREATED_MULTIPLE_TIMES) \
38 error(POSH__RUNTIME_PUBLISHER_PORT_NOT_UNIQUE) \
39 error(POSH__RUNTIME_SERVICE_DESCRIPTION_FORBIDDEN) \
40 error(POSH__RUNTIME_PUBLISHER_PORT_CREATION_UNKNOWN_ERROR) \
41 error(POSH__RUNTIME_SUBSCRIBER_PORT_CREATION_UNKNOWN_ERROR) \
42 error(POSH__RUNTIME_CLIENT_PORT_CREATION_UNKNOWN_ERROR) \
43 error(POSH__RUNTIME_SERVER_PORT_CREATION_UNKNOWN_ERROR) \
44 error(POSH__RUNTIME_ROUDI_PUBLISHER_LIST_FULL) \
45 error(POSH__RUNTIME_ROUDI_SUBSCRIBER_LIST_FULL) \
46 error(POSH__RUNTIME_ROUDI_OUT_OF_CLIENTS) \
47 error(POSH__RUNTIME_ROUDI_OUT_OF_SERVERS) \
48 error(POSH__RUNTIME_ROUDI_CONDITION_VARIABLE_LIST_FULL) \
49 error(POSH__RUNTIME_ROUDI_EVENT_VARIABLE_LIST_FULL) \
50 error(POSH__RUNTIME_ROUDI_REQUEST_PUBLISHER_INVALID_RESPONSE) \
51 error(POSH__RUNTIME_ROUDI_REQUEST_PUBLISHER_WRONG_IPC_MESSAGE_RESPONSE) \
52 error(POSH__RUNTIME_ROUDI_REQUEST_SUBSCRIBER_INVALID_RESPONSE) \
53 error(POSH__RUNTIME_ROUDI_REQUEST_SUBSCRIBER_WRONG_IPC_MESSAGE_RESPONSE) \
54 error(POSH__RUNTIME_ROUDI_REQUEST_CLIENT_INVALID_RESPONSE) \
55 error(POSH__RUNTIME_ROUDI_REQUEST_CLIENT_WRONG_IPC_MESSAGE_RESPONSE) \
56 error(POSH__RUNTIME_ROUDI_REQUEST_SERVER_INVALID_RESPONSE) \
57 error(POSH__RUNTIME_ROUDI_REQUEST_SERVER_WRONG_IPC_MESSAGE_RESPONSE) \
58 error(POSH__RUNTIME_ROUDI_REQUEST_CONDITION_VARIABLE_INVALID_RESPONSE) \
59 error(POSH__RUNTIME_ROUDI_REQUEST_CONDITION_VARIABLE_WRONG_IPC_MESSAGE_RESPONSE) \
60 error(POSH__RUNTIME_ROUDI_GET_MW_INTERFACE_INVALID_RESPONSE) \
61 error(POSH__RUNTIME_ROUDI_GET_MW_INTERFACE_WRONG_IPC_MESSAGE_RESPONSE) \
62 error(POSH__RUNTIME_ROUDI_CREATE_NODE_INVALID_RESPONSE) \
63 error(POSH__RUNTIME_ROUDI_CREATE_NODE_WRONG_IPC_MESSAGE_RESPONSE) \
64 error(POSH__RUNTIME_ROUDI_CONDITION_VARIABLE_CREATION_UNKNOWN_ERROR) \
65 error(POSH__RUNTIME_APP_WITH_SAME_RUNTIME_NAME_STILL_RUNNING) \
66 error(POSH__RUNTIME_NO_WRITABLE_SHM_SEGMENT) \
67 error(POSH__RUNTIME_NO_NAME_PROVIDED) \
68 error(POSH__RUNTIME_NAME_EMPTY) \
69 error(POSH__RUNTIME_LEADING_SLASH_PROVIDED) \
70 error(POSH__SERVICE_DISCOVERY_UNKNOWN_EVENT_PROVIDED) \
71 error(POSH__SERVICE_DISCOVERY_UNKNOWN_MESSAGE_PATTERN_PROVIDED) \
72 error(POSH__PORT_MANAGER_PUBLISHERPORT_NOT_UNIQUE) \
73 error(POSH__PORT_MANAGER_SERVERPORT_NOT_UNIQUE) \
74 error(POSH__PORT_MANAGER_COULD_NOT_ADD_SERVICE_TO_REGISTRY) \
75 error(POSH__PORT_MANAGER_INTERNAL_SERVICE_DESCRIPTION_IS_FORBIDDEN) \
76 error(POSH__MEMPOOL_POSSIBLE_DOUBLE_FREE) \
77 error(POSH__RECEIVERPORT_DELIVERYFIFO_OVERFLOW) \
78 error(POSH__SENDERPORT_SAMPLE_SIZE_CHANGED_FOR_ACTIVE_PORT) \
79 error(POSH__SENDERPORT_ACTIVATE_FIELD_WITHOUT_DATA) \
80 error(POSH__SENDERPORT_FIELD_SUBSCRIBE_WITHOUT_DATA) \
81 error(POSH__SENDERPORT_ACTIVATE_FIELD_WHEN_LATCHED_TOPIC_ACTIVATED) \
82 error(POSH__SENDERPORT_ALLOCATE_FAILED) \
83 error(POSH__SENDERPORT_SUBSCRIBER_LIST_OVERFLOW) \
84 error(POSH__PUBLISHING_EMPTY_SAMPLE) \
85 error(POSH__SENDING_EMPTY_REQUEST) \
86 error(POSH__SENDING_EMPTY_RESPONSE) \
87 error(POSH__SHM_APP_BASEADDRESS_VIOLATES_SPECIFICATION) \
88 error(POSH__SHM_APP_SEGMENT_BASEADDRESS_VIOLATES_SPECIFICATION) \
89 error(POSH__SHM_APP_MAPP_ERR) \
90 error(POSH__SHM_APP_SEGMENT_MAPP_ERR) \
91 error(POSH__SHM_APP_SEGMENT_COUNT_OVERFLOW) \
92 error(POSH__INTERFACEPORT_CAPRO_MESSAGE_DISMISSED) \
93 error(POSH__SERVICE_DISCOVERY_INSTANCE_CONTAINER_OVERFLOW) \
94 error(POPO__BASE_SUBSCRIBER_OVERRIDING_WITH_EVENT_SINCE_HAS_DATA_OR_DATA_RECEIVED_ALREADY_ATTACHED) \
95 error(POPO__BASE_SUBSCRIBER_OVERRIDING_WITH_STATE_SINCE_HAS_DATA_OR_DATA_RECEIVED_ALREADY_ATTACHED) \
96 error(POPO__BASE_CLIENT_OVERRIDING_WITH_EVENT_SINCE_HAS_RESPONSE_OR_RESPONSE_RECEIVED_ALREADY_ATTACHED) \
97 error(POPO__BASE_CLIENT_OVERRIDING_WITH_STATE_SINCE_HAS_RESPONSE_OR_RESPONSE_RECEIVED_ALREADY_ATTACHED) \
98 error(POPO__BASE_SERVER_OVERRIDING_WITH_EVENT_SINCE_HAS_REQUEST_OR_REQUEST_RECEIVED_ALREADY_ATTACHED) \
99 error(POPO__BASE_SERVER_OVERRIDING_WITH_STATE_SINCE_HAS_REQUEST_OR_REQUEST_RECEIVED_ALREADY_ATTACHED) \
100 error(POPO__CHUNK_QUEUE_POPPER_CHUNK_WITH_INCOMPATIBLE_CHUNK_HEADER_VERSION) \
101 error(POPO__CHUNK_DISTRIBUTOR_OVERFLOW_OF_QUEUE_CONTAINER) \
102 error(POPO__CHUNK_DISTRIBUTOR_CLEANUP_DEADLOCK_BECAUSE_BAD_APPLICATION_TERMINATION) \
103 error(POPO__CHUNK_SENDER_INVALID_CHUNK_TO_FREE_FROM_USER) \
104 error(POPO__CHUNK_SENDER_INVALID_CHUNK_TO_SEND_FROM_USER) \
105 error(POPO__CHUNK_RECEIVER_INVALID_CHUNK_TO_RELEASE_FROM_USER) \
106 error(POPO__CHUNK_LOCKING_ERROR) \
107 error(POPO__CHUNK_UNLOCKING_ERROR) \
108 error(POPO__CAPRO_PROTOCOL_ERROR) \
109 error(POPO__CLIENT_PORT_INVALID_REQUEST_TO_FREE_FROM_USER) \
110 error(POPO__CLIENT_PORT_INVALID_REQUEST_TO_SEND_FROM_USER) \
111 error(POPO__CLIENT_PORT_INVALID_RESPONSE_TO_RELEASE_FROM_USER) \
112 error(POPO__SERVER_PORT_INVALID_REQUEST_TO_RELEASE_FROM_USER) \
113 error(POPO__SERVER_PORT_INVALID_RESPONSE_TO_FREE_FROM_USER) \
114 error(POPO__SERVER_PORT_INVALID_RESPONSE_TO_SEND_FROM_USER) \
115 error(POPO__SERVER_PORT_NO_CLIENT_RESPONSE_QUEUE_TO_CONNECT) \
116 error(POPO__CONDITION_VARIABLE_DATA_FAILED_TO_CREATE_SEMAPHORE) \
117 error(POPO__CONDITION_LISTENER_SEMAPHORE_CORRUPTED_IN_WAS_TRIGGERED) \
118 error(POPO__CONDITION_LISTENER_SEMAPHORE_CORRUPTED_IN_WAIT) \
119 error(POPO__CONDITION_LISTENER_SEMAPHORE_CORRUPTED_IN_TIMED_WAIT) \
120 error(POPO__CONDITION_LISTENER_SEMAPHORE_CORRUPTED_IN_RESET) \
121 error(POPO__CONDITION_LISTENER_SEMAPHORE_CORRUPTED_IN_DESTROY) \
122 error(POPO__CONDITION_NOTIFIER_INDEX_TOO_LARGE) \
123 error(POPO__CONDITION_NOTIFIER_SEMAPHORE_CORRUPT_IN_NOTIFY) \
124 error(POPO__NOTIFICATION_INFO_TYPE_INCONSISTENCY_IN_GET_ORIGIN) \
125 error(POPO__TRIGGER_INVALID_RESET_CALLBACK) \
126 error(POPO__TRIGGER_INVALID_HAS_TRIGGERED_CALLBACK) \
127 error(POPO__TRIGGER_HANDLE_INVALID_RESET_CALLBACK) \
128 error(POPO__TYPED_UNIQUE_ID_ROUDI_HAS_ALREADY_DEFINED_CUSTOM_UNIQUE_ID) \
129 error(POPO__TYPED_UNIQUE_ID_OVERFLOW) \
130 error(POPO__WAITSET_COULD_NOT_DETACH_CONDITION) \
131 error(MEPOO__MEMPOOL_CONFIG_MUST_BE_ORDERED_BY_INCREASING_SIZE) \
132 error(MEPOO__MEMPOOL_GETCHUNK_CHUNK_WITHOUT_MEMPOOL) \
133 error(MEPOO__MEMPOOL_GETCHUNK_CHUNK_IS_TOO_LARGE) \
134 error(MEPOO__MEMPOOL_GETCHUNK_POOL_IS_RUNNING_OUT_OF_CHUNKS) \
135 error(MEPOO__MEMPOOL_CHUNKSIZE_MUST_BE_MULTIPLE_OF_CHUNK_MEMORY_ALIGNMENT) \
136 error(MEPOO__MEMPOOL_ADDMEMPOOL_AFTER_GENERATECHUNKMANAGEMENTPOOL) \
137 error(MEPOO__TYPED_MEMPOOL_HAS_INCONSISTENT_STATE) \
138 error(MEPOO__TYPED_MEMPOOL_MANAGEMENT_SEGMENT_IS_BROKEN) \
139 error(MEPOO__USER_WITH_MORE_THAN_ONE_WRITE_SEGMENT) \
140 error(MEPOO__SEGMENT_COULD_NOT_APPLY_POSIX_RIGHTS_TO_SHARED_MEMORY) \
141 error(MEPOO__SEGMENT_UNABLE_TO_CREATE_SHARED_MEMORY_OBJECT) \
142 error(MEPOO__INTROSPECTION_CONTAINER_FULL) \
143 error(MEPOO__CANNOT_ALLOCATE_CHUNK) \
144 error(MEPOO__MAXIMUM_NUMBER_OF_MEMPOOLS_REACHED) \
145 error(PORT_POOL__PUBLISHERLIST_OVERFLOW) \
146 error(PORT_POOL__SUBSCRIBERLIST_OVERFLOW) \
147 error(PORT_POOL__CLIENTLIST_OVERFLOW) \
148 error(PORT_POOL__SERVERLIST_OVERFLOW) \
149 error(PORT_POOL__INTERFACELIST_OVERFLOW) \
150 error(PORT_POOL__APPLICATIONLIST_OVERFLOW) \
151 error(PORT_POOL__NODELIST_OVERFLOW) \
152 error(PORT_POOL__CONDITION_VARIABLE_LIST_OVERFLOW) \
153 error(PORT_POOL__EVENT_VARIABLE_LIST_OVERFLOW) \
154 error(PORT_MANAGER__PORT_POOL_UNAVAILABLE) \
155 error(PORT_MANAGER__INTROSPECTION_MEMORY_MANAGER_UNAVAILABLE) \
156 error(PORT_MANAGER__HANDLE_PUBLISHER_PORTS_INVALID_CAPRO_MESSAGE) \
157 error(PORT_MANAGER__HANDLE_SUBSCRIBER_PORTS_INVALID_CAPRO_MESSAGE) \
158 error(PORT_MANAGER__HANDLE_CLIENT_PORTS_INVALID_CAPRO_MESSAGE) \
159 error(PORT_MANAGER__HANDLE_SERVER_PORTS_INVALID_CAPRO_MESSAGE) \
160 error(PORT_MANAGER__NO_PUBLISHER_PORT_FOR_INTERNAL_SERVICE) \
161 error(ROUDI_COMPONENTS__SHARED_MEMORY_UNAVAILABLE) \
162 error(ROUDI_APP__FAILED_TO_CREATE_SEMAPHORE) \
163 error(ROUDI_APP__FAILED_TO_UNLOCK_SEMAPHORE_IN_SIG_HANDLER) \
164 error(ROUDI__DEFAULT_ROUDI_MEMORY_FAILED_TO_ADD_SEGMENT_MANAGER_MEMORY_BLOCK) \
165 error(ROUDI__DEFAULT_ROUDI_MEMORY_FAILED_TO_ADD_INTROSPECTION_MEMORY_BLOCK) \
166 error(ROUDI__PRECONDITIONS_FOR_PROCESS_MANAGER_NOT_FULFILLED) \
167 error(ICEORYX_ROUDI_MEMORY_MANAGER__COULD_NOT_ACQUIRE_FILE_LOCK) \
168 error(ICEORYX_ROUDI_MEMORY_MANAGER__ROUDI_STILL_RUNNING) \
169 error(ICEORYX_ROUDI_MEMORY_MANAGER__FAILED_TO_ADD_PORTPOOL_MEMORY_BLOCK) \
170 error(ICEORYX_ROUDI_MEMORY_MANAGER__FAILED_TO_ADD_MANAGEMENT_MEMORY_BLOCK) \
171 error(MQ_UNKNOWN_MSG) \
172 error(MQ_INVALID_MSG) \
173 error(IPC_INTERFACE__UNABLE_TO_CREATE_APPLICATION_CHANNEL) \
174 error(IPC_INTERFACE__REG_ROUDI_NOT_AVAILABLE) \
175 error(IPC_INTERFACE__REG_UNABLE_TO_WRITE_TO_ROUDI_CHANNEL) \
176 error(IPC_INTERFACE__REG_ACK_INVALIG_NUMBER_OF_PARAMS) \
177 error(IPC_INTERFACE__REG_ACK_NO_RESPONSE) \
178 error(IPC_INTERFACE__CHECK_MQ_MAPS_TO_FILE) \
179 error(IPC_INTERFACE__APP_WITH_SAME_NAME_STILL_RUNNING) \
180 error(IPC_INTERFACE__COULD_NOT_ACQUIRE_FILE_LOCK) \
181 error(POSIX_WRAPPER__FAILED_TO_CREATE_SEMAPHORE) \
182 error(POSIX_TIMER__FIRED_TIMER_BUT_STATE_IS_INVALID) \
183 error(POSIX_TIMER__TIMERPOOL_OVERFLOW) \
184 error(POSIX_TIMER__INCONSISTENT_STATE) \
185 error(POSIX_TIMER__CALLBACK_RUNTIME_EXCEEDS_RETRIGGER_TIME) \
186 error(BINDING_C__UNDEFINED_STATE_IN_IOX_QUEUE_FULL_POLICY) \
187 error(BINDING_C__UNDEFINED_STATE_IN_IOX_CONSUMER_TOO_SLOW_POLICY) \
188 error(BINDING_C__PUBLISHER_OPTIONS_NOT_INITIALIZED) \
189 error(BINDING_C__SUBSCRIBER_OPTIONS_NOT_INITIALIZED) \
190 error(BINDING_C__C2CPP_ENUM_TRANSLATION_INVALID_SUBSCRIBER_EVENT_VALUE) \
191 error(BINDING_C__C2CPP_ENUM_TRANSLATION_INVALID_SUBSCRIBER_STATE_VALUE) \
192 error(BINDING_C__C2CPP_ENUM_TRANSLATION_INVALID_CLIENT_EVENT_VALUE) \
193 error(BINDING_C__C2CPP_ENUM_TRANSLATION_INVALID_CLIENT_STATE_VALUE) \
194 error(BINDING_C__C2CPP_ENUM_TRANSLATION_INVALID_SERVER_EVENT_VALUE) \
195 error(BINDING_C__C2CPP_ENUM_TRANSLATION_INVALID_SERVER_STATE_VALUE) \
196 error(BINDING_C__C2CPP_ENUM_TRANSLATION_INVALID_SERVICE_DISCOVERY_EVENT_VALUE) \
197 error(BINDING_C__C2CPP_ENUM_TRANSLATION_INVALID_MESSAGING_PATTERN_VALUE) \
198 error(EXPECTS_ENSURES_FAILED)
205#define CREATE_ICEORYX_ERROR_ENUM(name) k##name,
206#define CREATE_ICEORYX_ERROR_STRING(name) #name,
208enum class Error : uint32_t
210 ICEORYX_ERRORS(CREATE_ICEORYX_ERROR_ENUM)
217std::ostream&
operator<<(std::ostream& stream, Error value)
noexcept;
245using HandlerFunction = std::function<void(
const Error error,
const std::function<
void()>,
const ErrorLevel)>;
256 static cxx::GenericRAII setTemporaryErrorHandler(
const HandlerFunction& newHandler)
noexcept;
258 static const char* toString(
const Error error)
noexcept;
261 static void reactOnErrorLevel(
const ErrorLevel level,
const char* errorText)
noexcept;
264 static void defaultHandler(
const Error error,
265 const std::function<
void()>& errorCallBack,
268 static const char* ERROR_NAMES[];
269 static iox::HandlerFunction handler;
272 static std::mutex handler_mutex;
313 const std::function<
void()>& errorCallBack = std::function<
void()>(),
This handler is needed for unit testing, special debugging cases and other corner cases where we'd li...
Definition: error_handling.hpp:251
friend void errorHandler(const Error error, const std::function< void()> &errorCallBack, const ErrorLevel level) noexcept
Howto use the error handler correctly 1.) If the error you would like to handle is not listed in ICEO...
The GenericRAII class is a simple helper class to apply the C++ RAII idiom quickly....
Definition: generic_raii.hpp:46
building block to easily create free function for logging in a library context
Definition: lockfree_queue.hpp:29
void errorHandler(const Error error, const std::function< void()> &errorCallBack=std::function< void()>(), const ErrorLevel level=ErrorLevel::FATAL) noexcept
Howto use the error handler correctly 1.) If the error you would like to handle is not listed in ICEO...
std::ostream & operator<<(std::ostream &stream, Error value) noexcept
Convenience stream operator to easily use the Error enum with std::ostream.
ErrorLevel
the available error levels FATAL
Definition: error_handling.hpp:236
@ FATAL
Log error entry + Assert + terminate.
@ SEVERE
warning log entry + Assert
@ MODERATE
warning log entry