zoukankan      html  css  js  c++  java
  • PCL中异常处理机制

    博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=287

    本节我们主要讨论PCL在编写和应用过程中如何利用PCL的异常机制,提高程序的健壮性,首先从PCL开发者角度,解释如何定义和抛出自己的异常,最后从PCL使用者角度出发,解释用户如何捕获异常及处理异常。

    1 开发者如何增加一个新的异常类

    为了增强程序的健壮性,PCL提供了异常处理机制,作为PCL的开发者,需要通过自定义异常以及抛出异常,告诉调用者,在出现什么错误,并提示其如何处理,在PCL中,规定任何一个新定义的PCL异常类都需要继承于PCLException类,其具体定义在文件pcl/exceptions.h中,这样才能够使用PCL中其他和异常处理相关的机制和宏定义等。

    /** class MyException
      * rief An exception that is thrown when I want it.
      */
    class PCL_EXPORTS MyException :public PCLException
    {
    public:
        MyException (const std::string& error_description,
    const std::string& file_name ="",
    const std::string& function_name ="",
    unsigned line_number =0) throw ()
    : pcl::PCLException (error_description, file_name, function_name, line_number) { }
    };

    上面是一个最简单的自定义异常类,只定义了空的重构函数,但也足以可以完成对一般异常信息的抛出等功能了。

    2 如何使用自定义的异常

    在PCL中,为了方便开发者使用自定义的异常,定义下面宏定义:

    #define PCL_THROW_EXCEPTION (ExceptionName, message)
    {
    std::ostringstream s;
      s << message;
    throw ExceptionName (s.str (), __FILE__, "", __LINE__);
    }

    在异常抛出时使用就相当简单,添加下面的代码即可完成对异常的抛出:

    if (my_requirements != the_parameters_used_)
      PCL_THROW_EXCEPTION (MyException, "my requirements are not met "<< the_parameters_used);

    如此,通过宏调用,就可以实现对异常的抛出,此处抛出的异常包含异常信息、发生异常的文件名、以及异常发生的行号,当然这里异常信息可以包含很多信息,主要因为在宏定义中通过使用ostringstream的对象,开发者可以任意自定义自己的异常信息,例如添加运行过程当中一些重要的参数名或变量名以及其值等,这样就给异常捕获者更多有用的信息,方便异常处理。这里需要说明的另一个问题是,以以下代码为例:

    /** Function that does cool stuff
      * param nb number of points
      * 	hrows MyException
      */   //Doxygen格式的注释,在进行API文档生成时,会把该注释作为帮助信息,与函数说明放在一起。
    void                  
    myFunction (int nb);

    PCL开发者在自定义函数中,如果使用了异常抛出,则需要添加Doxygen格式的注释,这样可以在最终的API文档中产生帮助信息,使用者通过文档可以知道,在调用该函数时需要捕获异常和进行异常处理,本例中,在用户调用myFunction(int nb)函数时,就需要捕获处理MyException异常。

    3 异常的处理

    作为PCL的使用者来说,为了能更好的处理异常你需要使用try... catch程序块。此处和其他异常处理基本一样,例如下面实例:

    //在这里调用 myFunction时,可以捕获异常
    try
    {
      myObject.myFunction (some_number);
    //可以添加更多的其他异常捕获语句
    }
    // 针对try块捕获的MyException异常进行相应的处理
    catch (pcl::MyException& e)
    {
    //MyException异常处理代码
    }
    //下面一段代码是对任何异常进行捕获处理的
    #if 0
    catch (exception& e)
    {
      // 发生异常的处理代码
    }
    #endif

    异常的处理与其自身的上下文关系很大,并没有一般的规律可循,此处列举一些最常用的处理方式:

    a)         如果捕获的异常很关键那就终止运行。

    b)         修改异常抛出函数的当前调用参数,在此重新调用该函数。

    c)          抛出明确而对用户有意义的异常消息。

    d)         采取继续运行该程序,这种选择慎用

      敬请关注PCL(Point Cloud Learning)中国更多的点云库PCL(Point Cloud Library)相关官方教程。

    参考文献:

    1.朱德海、郭浩、苏伟.点云库PCL学习教程(ISBN 978-7-5124-0954-5)北京航空航天出版

  • 相关阅读:
    简单明了的带你理解springboot原理和三大核心注解
    Spring Boot(一):入门篇
    【Mysql优化】聚簇索引与非聚簇索引概念
    Mysql索引原理与优化
    Mysql全文索引的使用
    索引的优缺点,如何创建索引
    184 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 04 例:字符串与byte(即:字节)数组间的相互转换
    183 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 03 String常用方法(下)
    182 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 02 String常用方法(上)
    181 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 01 String常用方法简介
  • 原文地址:https://www.cnblogs.com/flyinggod/p/8596205.html
Copyright © 2011-2022 走看看