PCL在编写和应用的过程中,为了提高程序的稳健性,PCL提供了一套自己的异常处理机制。
PCL中的异常处理方式,依赖于内部自定的异常基类PCLException,它继承C++的std::runtime_error类。
/** \class PCLException
* \brief A base class for all pcl exceptions which inherits from std::runtime_error
*/
class PCLException : public std::runtime_error{
public:
PCLException (const std::string& error_description,
const char* file_name = NULL,
const char* function_name = NULL,
unsigned line_number = 0)
: std::runtime_error (createDetailedMessage (error_description,
file_name,
function_name,
line_number))
, file_name_ (file_name)
, function_name_ (function_name)
, line_number_ (line_number)
{}
// 其余成员函数和成员变量省略......
};
PCL中实现的异常类(例如:IOException、InitFailedException、KernelWidthTooSmallException等)均是继承PCLException类。若我们自己也需要实现一个异常类,也可以继承该基类。
此外,为了方便开发这使用自定义的异常类,PCL中提供了一个宏,方便开发者调用,如下所示:
/** PCL_THROW_EXCEPTION a helper macro to be used for throwing exceptions.
* This is an example on how to use:
* PCL_THROW_EXCEPTION(IOException,
* "encountered an error while opening " << filename << " PCD file");
*/
#define PCL_THROW_EXCEPTION(ExceptionName, message) \
{ \
std::ostringstream s; \
s << message; \
throw ExceptionName(s.str(), __FILE__, BOOST_CURRENT_FUNCTION, __LINE__); \
}
异常抛出宏是有了,那么该怎么去捕获PCL中的异常呢?我们可以用try…catch程序块进行处理,如下所示:
try{
// 调用PCL API的地方
}
catch (pcl::PCLException& e){
// 捕获PCL异常信息,并进行相应的处理
std::cout << "pcl::PCLException: " << e.what() << std::endl;
}