博客转载自: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
* \brief 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 =) 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
* \throws 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)北京航空航天出版

PCL中异常处理机制的更多相关文章

  1. java中异常处理机制 throw抛出自定义业务逻辑异常 throws继续抛出 catch捕获后会自动继续抛向调用方法

    package com.swift; public class Exception_TestC { public static void main(String[] args) { /* * 第5题: ...

  2. java中异常处理机制的简单原理

    以上是自认为的java异常处理的简单原理,如有不妥之处还请各位大神帮忙指点,谢谢!

  3. 3.4PCL中异常处理机制

    1.开发者如何增加一个新的异常类 2.如何使用自定义的异常 3.异常的处理

  4. Java基础(四)-异常处理机制及其设计

    本篇主要是记录自己所理解的Java异常处理机制(基于jdk1.7)以及怎么去处理和设计异常.还记得当初学习Java异常这块的时候都没怎么注意它的用途,以为就是简单的处理下异常,我避免程序出现这样错误就 ...

  5. C++中的异常处理机制

    C++中的捕获异常机制catch参数中实参的类型不同,采取的处理方式则不相同,且与普通的函数调用还不一样,具体表现为当抛出异常throw A()或throw obj时,对象会进行一次额外的对象复制操作 ...

  6. 16、java中的异常处理机制

    异常:就是程序在运行时出现不正常情况.异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述.并封装成对象. 其实就是java对不正常情况进行描述后的对象体现. 对于问题的划 ...

  7. ASP.NET(C#)中的try catch异常处理机制

    在开发一个Umbraco平台系统的过程中,遇到了问题. 写的代码如下 fileUrl = MediaHelper.GetMediaUrl(Convert.ToInt32(publishedConten ...

  8. SQL中存储过程中使用事务,并且加入异常处理机制.

    --存储过程中使用事务,并且加入异常处理机制. -- ============================================= CREATE PROCEDURE [dbo].[UP_ ...

  9. java中的异常处理机制

    java异常处理机制 1)在java语言中,通常将可能出现异常的语句放入try{}语句中,将出现错误后需要执行的语句放入到catch{}语句中,将无论是否发生异常都要执行的语句放在finally{}语 ...

随机推荐

  1. Touch ID和Passcode框架,Apple Watch风格的应用布局

    本文转载至 http://www.cocoachina.com/ios/20141031/10110.html 水平滚动条(artwalk) 测试环境:Xcode 6.0,iOS 8.0     VE ...

  2. UFLDL教程

    http://ufldl.stanford.edu/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B

  3. Unix环境高级编程——守护进程记录总结(从基础到实现)

    一.概念及其特征 守护进程是系统中生存期较长的一种进程,常常在系统引导装入时启动,在系统关闭时终止,没有控制终端,在后台运行.守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程 ...

  4. 网页直播、微信直播技术解决方案:EasyNVR与EasyDSS流媒体服务器组合之区分不同场景下的easynvr

    近期遇到好多客户咨询关于实现微信直播.或者是将直播页面集成进入自己项目中. 该方案的主要目的:完成在公网一直进行内网摄像头的RTMP/HLS直播! 实现方案的具体实现: EasyNVR+EasyDSS ...

  5. Hibernate的配置文件 Hibernate.cfg.xml与xxx.hbm.xml

    1.hibernate.cfg.xml配置如下: (数据库连接配置) <?xml version="1.0" encoding="UTF-8"?>& ...

  6. Linux RabbitMQ的安装、环境配置、远程访问 , Windows 下安装的RabbitMQ远程访问

    Linux  RabbitMQ的安装和环境配置 1.安装 RabbitMQ是使用Erlang语言编写的,所以安装RabbitMQ之前,先要安装Erlang环境 #对原来的yum官方源做个备份 1.mv ...

  7. Java for LeetCode 096 Unique Binary Search Trees

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  8. IOS平台的几个推送服务的对比

    http://blog.163.com/scuqifuguang@126/blog/static/171370086201399113833299/        最近研究了一下极光推送(JPush) ...

  9. 【Java 语言生态篇】Junit 测试单元

    01 概述   JUnit是一个由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework).Junit测试是白盒测试.JUn ...

  10. 统一ID服务

    代码已经修改 调用方式 为restful请求  或者 feign请求  请参考 wiki:   http://192.168.120.46:8090/display/peixun/akucun+Gui ...