欢迎来到天天文库
浏览记录
ID:44209438
大小:50.50 KB
页数:5页
时间:2019-10-19
《Linux下C程序的异常处理技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Linux下C++程序的异常处理技巧2005-03-1108:34作者:Agrawal出处:blog责任编辑:方舟相关专题:Linux设备驱动程序开发入门处理C++中的界常会在语言级别上遇到少许隐含限制,但在某些情况下,您可以绕过它们。学习各种利用异常的方法,您就可以生产更可靠的应用程序。保留异常来源信息在C++屮,无论何时在处理程序内捕获一个界常,关于该片常來源的信息都是不为人知的。异常的具体來源可以提供许多更好地处理该异常的重要信息,或者提供一些可以附加到错谋口志的信息,以便以后进行分析。为了解决这一问题,可以
2、在抛出并常语句期间,在并常对象的构造函数中生成一个堆栈跟踪。ExceptionTracer是示范这种行为的"个类。淸单1.在异常対象构造函数中牛成一个堆栈跟踪//SampleProgram://Compiler:gcc3.2.320030502//Linux:RedHat#include#include#include#includeusingnamespacestd;classExceptionTracer{public:Exc
3、eptionTracer(){void*array[25];intnSize=backtrace(array,25);char**symbols=backtrace_symbols(array,nSize);for(inti=0;i4、于未破坏状态。另一方面,如果这些信号被转换成C++异常,那么您可以优雅地调用其构造两数,并安排多层catch块,以便更好地处理这些信号。清单2中定义的SignalExceptionClass,提供了表示内核可能发出信号的C++异帘的抽象。SignalTranslator是一个基于SignalExceptionClass的模板类,它通常用來实现到C++界常的转换。在任何瞬间,只能冇一个信号处理程序处理一个活动进程的一个信号。因此,SignalTranslator采用了singleton设计模式。整体概念通过用于SIG5、SEGV的SegmentationFault类和用于SIGFPE的FloatingPointException类得到了展示。淸单2.将信号转换成界常templateclassSignalTranslator{private:classSingleTonTranslator{public:SingleTonTranslator(){signal(SignalExceptionClass::GetSignalNumber(),SignalHandler);}stat6、icvoidSignalHandler(int){throwSignalExceptionClass();}};public:SignalTranslator()staticSingleTonTranslators_objTranslator;}};//AnexampleforSIGSEGVclassSegmentationFault:publicExceptionTracer,publicexception{public:staticintGetSignalNumber(){returnSIGSEGV;}};Si7、gnalTranslatorvSegmentationFault>g_objSegmentationFaultTranslator;//AnexampleforSIGFPEclassFloatingPointException:publicExceptionTracer,publicexception{public:staticintGetSignalNumber(){returnSIGFPE;}};SignalTranslatorvFIoatingPointException>g_objFloatingPoint8、ExceptionTranslator;管理构造函数和析构函数中的异常在全局(询态全局)变量的构造和析构期间,每个ANSIC++都捕获到杲常是不可能的。因此,ANSIC++不建议在那些其实例可能被定义为全局实例(i挣态全局实例)的类的构造函数和析构函数中抛出异常。换一种说法就足永远都不要为那些其构造函数和析构函数可能抛出并常的类定义全局(静态金局)实例。不过
4、于未破坏状态。另一方面,如果这些信号被转换成C++异常,那么您可以优雅地调用其构造两数,并安排多层catch块,以便更好地处理这些信号。清单2中定义的SignalExceptionClass,提供了表示内核可能发出信号的C++异帘的抽象。SignalTranslator是一个基于SignalExceptionClass的模板类,它通常用來实现到C++界常的转换。在任何瞬间,只能冇一个信号处理程序处理一个活动进程的一个信号。因此,SignalTranslator采用了singleton设计模式。整体概念通过用于SIG
5、SEGV的SegmentationFault类和用于SIGFPE的FloatingPointException类得到了展示。淸单2.将信号转换成界常templateclassSignalTranslator{private:classSingleTonTranslator{public:SingleTonTranslator(){signal(SignalExceptionClass::GetSignalNumber(),SignalHandler);}stat
6、icvoidSignalHandler(int){throwSignalExceptionClass();}};public:SignalTranslator()staticSingleTonTranslators_objTranslator;}};//AnexampleforSIGSEGVclassSegmentationFault:publicExceptionTracer,publicexception{public:staticintGetSignalNumber(){returnSIGSEGV;}};Si
7、gnalTranslatorvSegmentationFault>g_objSegmentationFaultTranslator;//AnexampleforSIGFPEclassFloatingPointException:publicExceptionTracer,publicexception{public:staticintGetSignalNumber(){returnSIGFPE;}};SignalTranslatorvFIoatingPointException>g_objFloatingPoint
8、ExceptionTranslator;管理构造函数和析构函数中的异常在全局(询态全局)变量的构造和析构期间,每个ANSIC++都捕获到杲常是不可能的。因此,ANSIC++不建议在那些其实例可能被定义为全局实例(i挣态全局实例)的类的构造函数和析构函数中抛出异常。换一种说法就足永远都不要为那些其构造函数和析构函数可能抛出并常的类定义全局(静态金局)实例。不过
此文档下载收益归作者所有