POCO C++库学习和分析 -- 异常、错误处理、调试
POCO C++库学习和分析 -- 异常、错误处理、调试
1. 异常处理
C++同C语言相比,提供了异常机制。通过使用try,catch关键字可以捕获异常,这种机制使得程序员在程序异常发生时,可以通过判断异常类型,来决定程序是否继续执行,并在程序结束之前优雅的释放各类资源。当然对于C++的异常机制也存在着很多的争议。在这里,并不对此展开讨论,只介绍一下Poco中的异常类。
Poco中的异常类:
1. 所有的异常类都是Poco::Exception的子类。
2. Poco::Exception继承自std::exception类。
3. Foundation库中涉及的异常类,包括了下面一些:
a) Poco::LogicException类负责处理程序错误,包括了:
AssertionViolationException
NullPointerException
NullValueException
BugcheckException
InvalidArgumentException
NotImplementedException
RangeException
IllegalStateException
InvalidAccessException
SignalException
UnhandledException
b) Poco::ApplicationException类负责处理应用程序相关的错误,即使用Poco库的用户自定义异常。
c) Poco::RuntimeException类负责处理程序运行时的错误,包括了:
RuntimeException
NotFoundException
ExistsException
TimeoutException
SystemException
RegularExpressionException
LibraryLoadException
LibraryAlreadyLoadedException
NoThreadAvailableException
PropertyNotSupportedException
PoolOverflowException
NoPermissionException
OutOfMemoryException
DataException
DataFormatException
SyntaxException
CircularReferenceException
PathSyntaxException
IOException
ProtocolException
FileException
FileExistsException FileNotFoundException
PathNotFoundException
FileReadOnlyException
FileAccessDeniedException CreateFileException
OpenFileException
WriteFileException
ReadFileException
UnknownURISchemeException
成员函数及数据定义:
1. Poco::Exception包括了一个名字,这是一个静态的字符串,用来描述异常本身。比如说LogicException名字为"Logic exception",TimeoutException名字为"Timeout"。
2. Poco::Exception还包含了一个字符串消息,这是用来进一步描述异常的。使用的的人可以在运行时定义它。比如都是LogicException异常,函数一处抛出异常时可定义为"Function1",函数二处抛出时异常时可定义为用"Function2",它可以用来说明异常发生的具体位置和原因。
3. 一个可选的嵌套异常类
4. 构造函数:
a) 可以使用0个,1个或2个字符串参数来构造异常。在Poco::Exception内部存储的时候,第二个字符串会使用字符":"和第一个字符串串联。
b) 构造时如果使用了字符串和嵌套异常的方式,嵌套异常会被复制一份。
5. Poco::Exception支持拷贝和赋值运算符
6. const char* name()
返回异常的名称
7. const std::string& message()
返回在构造时传入的消息字符串
8. std::string displayText() const
同时返回异常名字和消息字符串,中间使用": "分隔
9. const Exception* nested() const
如果存在嵌套异常的话,返回之歌指向嵌套异常的指针,否则返回0
10. Exception* clone() const
返回一个异常的拷贝
11. void rethrow() const
重新抛出异常
定义自己的异常:
因为从Poco::Exception继承,去定义自己的异常时,工作非常的枯燥且重复(用户需要重载大量的虚函数),在库中提供了两个宏来完成这个工作:
POCO_DECLARE_EXCEPTION:用来申明异常宏
POCO_IMPLEMENT_EXCEPTION: 用来定义异常宏的执行体
两个宏分别定义如下:
[cpp] 1. // MyException.h
2. #include "Poco/Exception.h"
3. POCO_DECLARE_EXCEPTION(MyLib_API, MyException, Poco::Exception)
1. // MyException.cpp
2. #include "MyException.h"POCO_IMPLEMENT_EXCEPTION(MyException, Poco::Exception,"Something really ba
d happened...")
宏展开分别为:
[cpp] 1. // MyException.h
2. #include "Poco/Exception.h"
3. POCO_DECLARE_EXCEPTION(MyLib_API, MyException, Poco::Exception)
4. class MyLib_API MyException: public Poco::Exception
5. {
6. public:
7. MyException();
8. MyException(const std::string& msg);
9. MyException(const std::string& msg, const std::string& arg);
10. MyException(const std::string& msg, const Poco::Exception& nested);
11. MyException(const MyException& exc);
12. ~MyException();
13. MyException& operator = (const MyException& exc);
14. const char* name() const;
15. ...
16. };
1. // MyException.cpp
2. #include "MyException.h"
3. POCO_IMPLEMENT_EXCEPTION(MyException, Poco::Exception,
4. "Something really bad happened...")
5. ...
6. const char* MyException::name() const throw()
7. {
8. return "Something really bad happened...";
9. }
10. ...
下面是一个例子:
[cpp] 1. #include "Poco/Exception.h"
2. #include <iostream>
3. int main(int argc, char** argv)
4. {
5. Poco::Exception* pExc = 0;
6. try
7. {
8. throw Poco::ApplicationException("just testing");
9. }
10. catch (Poco::Exception& exc)
11. {
12. pExc = exc.clone();
13. }
14. try
15. {
16. pExc->rethrow(); 17. }
18. catch (Poco::Exception& exc)
19. {
20. std::cerr << exc.displayText() << std::endl;
21. }
22. delete pExc;
23. return 0;
24. }
2. 断言
POCO库中提供了一些断言的宏来进行运行时检查,这些断言能够提供出错代码的行号和文件信息。
1. Debugger::_assert(cond)
如果cond ≠ true时,抛出一个AssertionViolationException异常。
2. poco_assert_dbg(cond)
同poco_assert类似,但是只在debug模式下起作用
3. poco_check_ …… 此处隐藏:6962字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [教学研究]2012西拉科学校团少队工作总结
- [教学研究]建筑工程公司档案管理制度
- [教学研究]小学数学人教版六年级上册圆的周长和面
- [教学研究]ERP电子行业解决方案
- [教学研究]钢支撑租赁合同范本
- [教学研究]预应力自动张拉系统用户手册Rev1.0
- [教学研究]MOOC课程:金瓶梅人物写真(每章节课后
- [教学研究]追加被执行人申请书(适用追加夫妻关系)
- [教学研究]2014年驾考科目一考试最新题库766
- [教学研究]2013-2014学年度九年级物理第15章《电
- [教学研究]新版中日交流标准日本语初级下26课-客
- [教学研究]小导管注浆施工作业指导书
- [教学研究]一般财务人员能力及人岗匹配评估表
- [教学研究]打1.2.页 小学一年级暑假口算100以内加
- [教学研究]学习贯彻《中国共产党党和国家机关基层
- [教学研究]2012年呼和浩特市中考试卷_35412
- [教学研究]最简易的电线电缆购销合同范本
- [教学研究]如何开展安全标准化建设
- [教学研究]工作分析与人岗匹配
- [教学研究]2016-2017学年高中历史第七单元现代中
- 山东省义务教育必修地方课程小学三年级
- 台湾宜兰大学互联网交换技术课程 01_In
- 思想品德:第一课《我知我家》课件(人
- SAR合成孔径雷达图像点目标仿真报告(附
- 利辛县“十三五”规划研究报告
- 2015-2020年中国手机APP行业市场发展趋
- 广告策略、创意表现、媒体方案
- 企业如何申请专利的的几点思考
- 《中国教育简史》网上作业
- 高中历史第二单元西方人文精神的起源及
- 年终晚会必备_精彩的主持稿_精心整理_
- 信息工程专业自荐书
- 2019高考历史人教版一轮练习:第十二单
- JAVA俱乐部管理系统软件需求规格说明书
- 2016-2021年中国小型板料折弯机行业市
- (人教新课标)六上_比的基本性质课件PPT
- 辽宁省公务员考试网申论备考技巧:名言
- 神经阻滞麻醉知情同意书
- 施工企业信息填报、审核和发布的相关事
- 初一(七年级)英语完形填空100篇




