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)北京航空航天出版

  • 相关阅读:
    PS 给天空添加蓝天白云<转载>
    Study 8 —— 行块元素及定位
    Study 7 —— CSS美化背景和边框
    Study 6 —— 字体和段落属性
    Study 5 —— CSS概述
    Study 4 —— 表单标签
    Study 3 —— 表格
    Study 2 —— 图片热点区域
    Study 1 —— HTML5概述
    CentOS6.x下,tomcat
  • 原文地址:https://www.cnblogs.com/flyinggod/p/8596205.html
Copyright © 2011-2022 走看看