博客转载自: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. 50道JAVA基础编程练习题 - 题目

    50道JAVA基础编程练习题[1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? [2]题目:判断 ...

  2. 按模板导出Excel

    说明:开发环境 vs2012 asp.net mvc4 c# 注意:Excel模板有多个sheet页,导出Excel的时候,同时给多个sheet页填充数据 1.项目结构 3.Excel模板(注意she ...

  3. 九度OJ 1045:百鸡问题 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8410 解决:3644 题目描述: 用小于等于n元去买100只鸡,大鸡5元/只,小鸡3元/只,还有1/3元每只的一种小鸡,分别记为x只,y只 ...

  4. 【ansible】ansible部署方式以及部署包

    最近研究ansible的使用,在使用pip安装的时候遇到很多奇怪的问题,为此采用了手动安装的方式,并编写了一键安装脚本. ansible要求机器必须安装python2.6以上版本,可以通过一下命令查看 ...

  5. keras:Exception: Error when checking model target

    问题: 用keras的functional API搭建多输入多输出模型时,报错某个输出层对应的类标数组大小与模型中不一致. 解决办法:升级keras到最新版(doge脸)keras迭代太快了啊摔,总有 ...

  6. UML类图几种关系的总结 ---(转载)

    在UML类图中,常见的有以下几种关系:泛化(Generalization),  实现(Realization),关联(Association),聚合(Aggregation),组合(Compositi ...

  7. 爬虫前戏(回顾掌握) -- HTTP和HTTPS

    一.HTTP协议 1.官方概念: HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文 ...

  8. jQuery 的文档操作

    在 js 中也有DOM操作,也可以进行 增删改查 ,但是通过 js 的DOM操作会发现,我的天哪,代码好多.但是 jQuery的文档操作就少了很多. js 中 DOM 的示例 : var box = ...

  9. Android NDK环境搭建

    本文主要记录NDK环境在Ubuntu下的搭建. 下载NDK 在官网进行下载NDK https://developer.android.com/ndk/downloads/index.html 当前最新 ...

  10. BA优化PnP的思路

    由之前的PnP,可以求出一个R,t,K又是已知的.而且空间点的世界坐标知道,第二个相机位姿的像素坐标也是知道的.就可以利用它们进行优化.首先确定变量为const vector<Point3f&g ...