iox🔗
building block to easily create free function for logging in a library context More...
Namespaces🔗
Name |
---|
iox::algorithm |
iox::concurrent |
iox::cxx |
iox::log |
iox::posix |
Classes🔗
Name | |
---|---|
class | iox::ErrorHandler This handler is needed for unit testing, special debugging cases and other corner cases where we'd like to explicitly suppress the error handling. |
Types🔗
Name | |
---|---|
enum uint32_t | Error { } |
enum uint32_t | ErrorLevel { FATAL, SEVERE, MODERATE} the available error levels FATAL |
using std::function< void(const Error error, const std::function< void()>, const ErrorLevel)> | HandlerFunction |
Functions🔗
Name | |
---|---|
std::ostream & | operator<<(std::ostream & stream, Error value) Convenience stream operator to easily use the Error enum with std::ostream. |
void | errorHandler(const Error error, const std::function< void()> & errorCallBack =std::function< void()>(), const ErrorLevel level =ErrorLevel::FATAL) Howto use the error handler correctly 1.) If the error you would like to handle is not listed in ICEORYX_ERRORS(error)... macro just add them like: error(MODULE_NAME__MY_FUNKY_ERROR) Attention: Create an error after the following convention: MODULE_NAME__A_CLEAR_BUT_SHORT_ERROR_DESCRIPTION And a long name is alright! |
Detailed Description🔗
building block to easily create free function for logging in a library context
// add this to e.g. foo_logging.hpp
// the logger can then be used with e.g. foo::LogInfo() of just LogInfo() in the same namespace
#ifndef FOO_LOGGING_HPP_INCLUDED
#define FOO_LOGGING_HPP_INCLUDED
#include "iceoryx_hoofs/log/logging_free_function_building_block.hpp"
namespace foo
{
struct LoggingComponent
{
static constexpr char Ctx[] = "FOO";
static constexpr char Description[] = "Log context of the FOO component!";
};
static constexpr auto LogFatal = iox::log::ffbb::LogFatal<LoggingComponent>;
static constexpr auto LogError = iox::log::ffbb::LogError<LoggingComponent>;
static constexpr auto LogWarn = iox::log::ffbb::LogWarn<LoggingComponent>;
static constexpr auto LogInfo = iox::log::ffbb::LogInfo<LoggingComponent>;
static constexpr auto LogDebug = iox::log::ffbb::LogDebug<LoggingComponent>;
static constexpr auto LogVerbose = iox::log::ffbb::LogVerbose<LoggingComponent>;
} // namespace foo
#endif // FOO_LOGGING_HPP_INCLUDED
// this needs to be in foo_logging.cpp
namespace foo
{
constexpr char ComponentPosh::Ctx[];
constexpr char ComponentPosh::Description[];
} // namespace foo
Types Documentation🔗
enum Error🔗
Enumerator | Value | Description |
---|---|---|
enum ErrorLevel🔗
Enumerator | Value | Description |
---|---|---|
FATAL | Log error entry + Assert + terminate. | |
SEVERE | warning log entry + Assert | |
MODERATE | warning log entry |
the available error levels FATAL
- Log message with FATAL
- RouDi cannot recover from that error. RouDi is terminated
- Assert (in DEBUG) and terminate
- Reporting code must handle this and continue or go to a save state. Error handler could return (e.g. in test) SEVERE
- Log message with ERROR
- RouDi can still run. Error is reported
- Assert in DEBUG, in RELEASE continue to run
- Reporting code must handle this and continue MODERATE
- Log message with ERROR
- RouDi can still run. Error is reported
- NO assert
- Reporting code must handle this and continue
using HandlerFunction🔗
using iox::HandlerFunction = typedef std::function<void(const Error error, const std::function<void()>, const ErrorLevel)>;
Functions Documentation🔗
function operator<<🔗
std::ostream & operator<<(
std::ostream & stream,
Error value
)
Convenience stream operator to easily use the Error enum with std::ostream.
Parameters:
- stream sink to write the message to
- value to convert to a string literal
Return: the reference to stream
which was provided as input parameter
function errorHandler🔗
void errorHandler(
const Error error,
const std::function< void()> & errorCallBack =std::function< void()>(),
const ErrorLevel level =ErrorLevel::FATAL
)
Howto use the error handler correctly 1.) If the error you would like to handle is not listed in ICEORYX_ERRORS(error)... macro just add them like: error(MODULE_NAME__MY_FUNKY_ERROR) Attention: Create an error after the following convention: MODULE_NAME__A_CLEAR_BUT_SHORT_ERROR_DESCRIPTION And a long name is alright!
2.) Call errorHandler(Error::kMODULE_NAME__MY_FUNKY_ERROR); Please pay attention to the "k" prefix The defaults for errorCallback and ErrorLevel can also be overwritten: errorHandler( Error::kMODULE_NAME__MY_FUNKY_ERROR, []{ std::cout << "MyCustomCallback" << std::endl; }, ErrorLevel::MODERATE );
class PrettyClass {
float division(float a, float b) {
if ( b == 0.0f ) {
errorHandler(Error::kPRETTY_CLASS__DIVISION_BY_ZERO);
}
}
};
bool called = false;
auto temporaryErrorHandler = ErrorHandler::setTemporaryErrorHandler(
[&](const Error e, std::function<void()>, const ErrorLevel) {
called = true;
});
errorHandler(Error::kTEST__ASSERT_CALLED);
ASSERT_TRUE(called);
Updated on 2 April 2022 at 16:37:47 CEST