Macros for exception handling

1. Exception classes

All exceptions that can be raised by MRPT API are derived from the C++ standard std::exception, so if you want to catch all of them, your code should have (at least at the top level, for example, in main() ) the following try/catch block:

int main(int argc, char **argv)
{
 try
 {
   // do whatever...
   return 0;
 }
 catch(std::exception &e)
 {
    std::cerr << e.what() << std::endl;
    return 1;
 }
}

In fact, all MRPT exceptions are of the types (derived from std::exception):

So if you want to handle in a different way one specific type of error, the following can be done:

int main(int argc, char **argv)
{
 try
 {
 // do whatever...
 return 0;
 }
 catch(mrpt::utils::CExceptionEOF &e)
 {
   // This was a EOF error
   std::cerr << e.what() << std::endl;
   return 1;
 }
 catch(std::exception &e)
 {
  // All other errors
  std::cerr << e.what() << std::endl;
  return 1;
 }
}

2. Exception raising macros (assert-like MACROS)

 

// A compile-time assertion
MRPT_COMPILE_TIME_ASSERT( condition )

// A softer alternative to C assert() that doesn't
// abort the program, but raises an std::exception
ASSERT_( condition )

// As ASSERT_() but the exception will contain the given custom message
// instead of a textual representation of "condition"
ASSERTMSG_( condition, "custom message" )

// As ASSERT_(), but on fail displays a message like:
// ASSERT_EQUAL(w.size(),v.size()) failed with
// w.size()=10
// v.size()=12
ASSERT_EQUAL_( a, b )
ASSERT_NOT_EQUAL_( a, b )
ASSERT_BELOW_( a, b )
ASSERT_ABOVE_( a, b )

// As ASSERT_() but only has effect in DEBUG builds.
ASSERTDEB_( condition )

// As ASSERTMSG_() but only has effect in DEBUG builds.
ASSERTDEBMSG_( condition, "custom message" )

// Raises a std::logic_error exception with the custom message
// and the source code file name, line number, and function name
THROW_EXCEPTION("message")

// Just like THROW_EXCEPTION() but the message has one printf-like format
// specifier which is expanded with the second argument
THROW_EXCEPTION_CUSTOM_MSG1("message %i", myVar )

// Checks for the existence of a file, raising an exception with an
// explanatory message otherwise
ASSERT_FILE_EXISTS_(fileName)

Note that there’s no need to add a semicolon (;) at the end of the macros above.

 

3. Special MACROS for exception propagation

Most MRPT functions and methods use MRPT_START/MRPT_END macros, which enables (among other things) to automatically display the inverse call stack upon an exception. The exception e.what() string will typically contain a stack trace like:

 

 =============== MRPT EXCEPTION =============
size_t mrpt::math::KDTreeCapable::kdTreeClosestPoint2D(float, float, float&, float&, float&) const, line 201:
Assert condition failed: x0==10
virtual void mrpt::slam::CPointsMap::computeMatchingWith2D(const mrpt::slam::CMetricMap*, const mrpt::poses::CPose2D&, float, float, const mrpt::poses::CPose2D&, mrpt::utils::TMatchingPairList&, float&, float*, bool, bool) const, line 586:
mrpt::poses::CPosePDFPtr mrpt::slam::CICP::ICP_Method_Classic(const mrpt::slam::CMetricMap*, const mrpt::slam::CMetricMap*, const mrpt::poses::CPosePDFGaussian&, mrpt::slam::CICP::TReturnInfo&), line 562:
virtual mrpt::poses::CPosePDFPtr mrpt::slam::CICP::AlignPDF(const mrpt::slam::CMetricMap*, const mrpt::slam::CMetricMap*, const mrpt::poses::CPosePDFGaussian&, float*, void*), line 104:
void mrpt::slam::CMetricMapBuilderICP::processObservation(const mrpt::slam::CObservationPtr&), line 376:
void MapBuilding_ICP(const std::string&), line 442: