LCOV - code coverage report
Current view: top level - src/AH/Error - Error.hpp (source / functions) Hit Total Coverage
Test: 3aaab29ec58d6e71a20fde08a40531cf32318591 Lines: 4 4 100.0 %
Date: 2024-05-18 12:29:05 Functions: 3 3 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : #pragma once
       2             : 
       3             : /// @file
       4             : 
       5             : #include <AH/Debug/Debug.hpp>
       6             : 
       7             : #ifdef ARDUINO // ------------------------------------------------------ ARDUINO
       8             : 
       9             : BEGIN_AH_NAMESPACE
      10             : 
      11             : /// Function that executes and loops forever, blinking the built-in LED when a
      12             : /// fatal error is encountered.
      13             : extern void fatalErrorExit() __attribute__((noreturn));
      14             : 
      15             : END_AH_NAMESPACE
      16             : 
      17             : #ifdef FATAL_ERRORS
      18             : 
      19             : #define ERROR(msg, errc)                                                       \
      20             :     do {                                                                       \
      21             :         USING_AH_NAMESPACE;                                                    \
      22             :         DEBUGFN(msg << " (0x" << hex << uppercase << errc << dec               \
      23             :                     << nouppercase << ')');                                    \
      24             :         fatalErrorExit();                                                      \
      25             :     } while (0)
      26             : 
      27             : #else
      28             : 
      29             : /// Print the error message and error code, and stop the execution if
      30             : /// `FATAL_ERRORS` are enabled. Otherwise just prints the error.
      31             : ///
      32             : /// @param  msg
      33             : ///         The information to print, can contain streaming operators (`<<`) to
      34             : ///         print multiple things.
      35             : /// @param  errc
      36             : ///         A unique error code.
      37             : ///
      38             : /// @ingroup    AH_Error
      39             : #define ERROR(msg, errc)                                                       \
      40             :     do {                                                                       \
      41             :         DEBUGFN(msg << " (0x" << hex << uppercase << errc << dec               \
      42             :                     << nouppercase << ')');                                    \
      43             :     } while (0)
      44             : 
      45             : #endif
      46             : 
      47             : /// Print the error message and error code, and stop the execution.
      48             : /// Doesn't depend on `FATAL_ERRORS`, it always stops the execution.
      49             : ///
      50             : /// @param  msg
      51             : ///         The information to print, can contain streaming operators (`<<`) to
      52             : ///         print multiple things.
      53             : /// @param  errc
      54             : ///         A unique error code.
      55             : ///
      56             : /// @ingroup    AH_Error
      57             : #define FATAL_ERROR(msg, errc)                                                 \
      58             :     do {                                                                       \
      59             :         USING_AH_NAMESPACE;                                                    \
      60             :         DEBUGFN(F("Fatal Error: ") << msg << " (0x" << hex << uppercase        \
      61             :                                    << errc << dec << nouppercase << ')');      \
      62             :         fatalErrorExit();                                                      \
      63             :     } while (0)
      64             : 
      65             : #else // ----------------------------------------------------------------- TESTS
      66             : 
      67             : #include <exception>
      68             : #include <sstream>
      69             : 
      70             : BEGIN_AH_NAMESPACE
      71             : 
      72             : class ErrorException : public std::exception {
      73             :   public:
      74          22 :     ErrorException(const std::string message, int errorCode)
      75          22 :         : message(std::move(message)), errorCode(errorCode) {}
      76           4 :     const char *what() const throw() override { return message.c_str(); }
      77          16 :     int getErrorCode() const { return errorCode; }
      78             : 
      79             :   private:
      80             :     const std::string message;
      81             :     const int errorCode;
      82             : };
      83             : 
      84             : END_AH_NAMESPACE
      85             : 
      86             : #define ERROR(msg, errc)                                                       \
      87             :     do {                                                                       \
      88             :         USING_AH_NAMESPACE;                                                    \
      89             :         std::ostringstream s;                                                  \
      90             :         s << DEBUG_FUNC_LOCATION << msg;                                       \
      91             :         throw ErrorException(s.str(), errc);                                   \
      92             :     } while (0)
      93             : 
      94             : #define FATAL_ERROR(msg, errc)                                                 \
      95             :     do {                                                                       \
      96             :         USING_AH_NAMESPACE;                                                    \
      97             :         std::ostringstream s;                                                  \
      98             :         s << DEBUG_FUNC_LOCATION << msg;                                       \
      99             :         throw ErrorException(s.str(), errc);                                   \
     100             :     } while (0)
     101             : 
     102             : #endif

Generated by: LCOV version 1.15