欢迎来到天天文库
浏览记录
ID:9251433
大小:14.50 KB
页数:5页
时间:2018-04-25
《linux 下 c 程序的异常处理技巧》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、Linux下C++程序的异常处理技巧 处理C++中的异常会在语言级别上遇到少许隐含限制,但在某些情况下,您可以绕过它们。学习各种利用异常的方法,您就可以生产更可靠的应用程序。保留异常来源信息 在C++中,无论何时在处理程序内捕获一个异常,关于该异常来源的信息都是不为人知的。异常的具体来源可以提供许多更好地处理该异常的重要信息,或者提供一些可以附加到错误日志的信息,以便以后进行分析。 为了解决这一问题,可以在抛出异常语句期间,在异常对象的构造函数中生成一个堆栈跟踪。ExceptionTracer是示范这种行为的一个类。清单1.在异常对象构造函数中生成一个堆栈跟踪//Sample
2、Program://Compiler:gcc3.2.3//Linux:RedHat#include#include#include#includeusingnamespacestd;/////////////////////////////////////////////classExceptionTracer{ public:ExceptionTracer(){ void*array[25]; intnSize=backtrace(array,25); char**symbols=backtr
3、ace_symbols(array,nSize); for(inti=0;i4、内核可能发出信号的C++异常的抽象。SignalTranslator是一个基于SignalExceptionClass的模板类,它通常用来实现到C++异常的转换。在任何瞬间,只能有一个信号处理程序处理一个活动进程的一个信号。因此,SignalTranslator采用了singleton设计模式。整体概念通过用于SIGSEGV的SegmentationFault类和用于SIGFPE的FloatingPointException类得到了展示。清单2.将信号转换成异常templateclassSignalTranslator{ pr5、ivate:classSingleTonTranslator{ public:SingleTonTranslator(){ signal(SignalExceptionClass::GetSignalNumber(),SignalHandler);}staticvoidSignalHandler(int){ throwSignalExceptionClass();} }; public:SignalTranslator(){ staticSingleTonTranslators_objTranslator;}};//AnexampleforSIGSEGVclassSegmenta6、tionFault:publicExceptionTracer,publicexception{ public:staticintGetSignalNumber(){returnSIGSEGV;}};SignalTranslatorg_objSegmentationFaultTranslator;//AnexampleforSIGFPEclassFloatingPointException:publicExceptionTracer,publicexception{ public:staticintGetSignalNumber(){retu7、rnSIGFPE;}};SignalTranslatorg_objFloatingPointExceptionTranslator;管理构造函数和析构函数中的异常 在全局(静态全局)变量的构造和析构期间,每个ANSIC++都捕获到异常是不可能的。因此,ANSIC++不建议在那些其实例可能被定义为全局实例(静态全局实例)的类的构造函数和析构函数中抛出异常。换一种说法就是永远都不要为那些其构造函数和析构函数可能抛出异常的类定义全局(静
4、内核可能发出信号的C++异常的抽象。SignalTranslator是一个基于SignalExceptionClass的模板类,它通常用来实现到C++异常的转换。在任何瞬间,只能有一个信号处理程序处理一个活动进程的一个信号。因此,SignalTranslator采用了singleton设计模式。整体概念通过用于SIGSEGV的SegmentationFault类和用于SIGFPE的FloatingPointException类得到了展示。清单2.将信号转换成异常templateclassSignalTranslator{ pr
5、ivate:classSingleTonTranslator{ public:SingleTonTranslator(){ signal(SignalExceptionClass::GetSignalNumber(),SignalHandler);}staticvoidSignalHandler(int){ throwSignalExceptionClass();} }; public:SignalTranslator(){ staticSingleTonTranslators_objTranslator;}};//AnexampleforSIGSEGVclassSegmenta
6、tionFault:publicExceptionTracer,publicexception{ public:staticintGetSignalNumber(){returnSIGSEGV;}};SignalTranslatorg_objSegmentationFaultTranslator;//AnexampleforSIGFPEclassFloatingPointException:publicExceptionTracer,publicexception{ public:staticintGetSignalNumber(){retu
7、rnSIGFPE;}};SignalTranslatorg_objFloatingPointExceptionTranslator;管理构造函数和析构函数中的异常 在全局(静态全局)变量的构造和析构期间,每个ANSIC++都捕获到异常是不可能的。因此,ANSIC++不建议在那些其实例可能被定义为全局实例(静态全局实例)的类的构造函数和析构函数中抛出异常。换一种说法就是永远都不要为那些其构造函数和析构函数可能抛出异常的类定义全局(静
此文档下载收益归作者所有