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;
}
}
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.
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: