首页 >> 干燥塔

Linux环境下C程序异常的处理技巧金属打标机

发布时间:2022-08-25 11:23:03 来源:圣叠五金网

Linux环境下C++程序异常的处理技巧

Linux环境下C++程序异常的处理技巧 2011: 处理 C++ 中的异常会在语言级别上遇到少许隐含限制,但在某些情况下,您可以绕过它们。学习各种利用异常的方法,您就可以生产更可靠的应用程序。保留异常来源信息在C++中,无论何时在处理程序内捕获一个异常,关于该异常来源的信息都是不为人知的。异常的具体来源可以提供许多更好地处理该异常的重要信息,或者提供一些可以附加到错误日志的信息,以便以后进行分析。 为了解决这一问题,可以在抛出异常语句期间,在异常对象的构造函数中生成一个堆栈跟踪。ExceptionTracer是示范这种行为的一个类。 清单 1. 在异常对象构造函数中生成一个堆栈跟踪// Sample Program:// Compiler: gcc 3.2.3 20030502// Linux: Red Hat#include #include #include #include using namespace std;/////////////////////////////////////////////class ExceptionTracer{public: ExceptionTracer(){void * array[25];int nSize = backtrace(array, 25);char ** symbols = backtrace_symbols(array, nSize);  for (int i = 0; i class SignalTranslator{private:class SingleTonTranslator{public:SingleTonTranslator(){signal(SignalExceptionClass::GetSignalNumber(), SignalHandler);}static void SignalHandler(int){throw SignalExceptionClass();}};public:SignalTranslator(){static SingleTonTranslator s_objTranslator;}};// An example for SIGSEGVclass SegmentationFault : public ExceptionTracer, public exception{public:static int GetSignalNumber() {return SIGSEGV;}};SignalTranslator g_objSegmentationFaultTranslator;// An example for SIGFPEclass FloatingPointException : public ExceptionTracer, public exception{public:static int GetSignalNumber() {return SIGFPE;}};SignalTranslator g_objFloatingPointExceptionTranslator;管理构造函数和析构函数中的异常在全局(静态全局)变量的构造和析构期间,每个 ANSI C++ 都捕获到异常是不可能的。因此,ANSI C++ 不建议在那些其实例可能被定义为全局实例(静态全局实例)的类的构造函数和析构函数中抛出异常。换一种说法就是永远都不要为那些其构造函数和析构函数可能抛出异常的类定义全局(静态全局)实例。不过,如果假定有一个特定编译器和一个特定系统,那么可能可以这样做,幸运的是,对于Linux 上的 GCC,恰好是这种情况。 使用 ExceptionHandler 类可以展示这一点,该类也采用了 singleton 设计模式。其构造函数注册了一个未捕获的处理程序。因为每次只能有一个未捕获的处理程序处理一个活动进程,构造函数应该只被调用一次,因此要采用singleton 模式。应该在定义有问题的实际全局(静态全局)变量之前定义 ExceptionHandler 的全局(静态全局)实例。 清单 3. 处理构造函数中的异常class ExceptionHandler{private:class SingleTonHandler{public:SingleTonHandler(){set_terminate(Handler);}static void Handler(){// Exception from construction/destruction of global variables try{// re-throw throw;}catch (SegmentationFault &){cout << “SegmentationFault” << endl;}catch (FloatingPointException &){cout << “FloatingPointException” << endl;}catch (...){cout << “Unknown Exception” << endl;}//if this is a thread performing some core activityabort();// else if this is a thread used to service requests// pthread_exit();}};public:ExceptionHandler(){static SingleTonHandler s_objHandler;}};//////////////////////////////////////////////////////////////////////////class A{public:A(){//int i = 0, j = 1/i;*(int *)0 = 0;}};// Before defining any global variable, we define a dummy instance// of ExceptionHandler object to make sure that// ExceptionHandler::SingleTonHandler::SingleTonHandler() is invokedExceptionHandler g_objExceptionHandler;A g_a;//////////////////////////////////////////////////////////////////////////int main(int argc, char* argv[]){return 0;}处理多线程程序中的异常有时一些异常没有被捕获,这将造成进程异常中止。不过很多时候,进程包含多个线程,其中少数线程执行核心应用程序逻辑,同时,其余线程为外部请求提供服务。如果服务线程因编程错误而没有处理某个异常,则会造成整个应用程序崩溃。这一点可能是不受人们欢迎的,因为它会通过向应用程序传送不合法的请求而助长拒绝服务攻击。为了避免这一点,未捕获处理程序可以决定是请求异常中止调用,还是请求线程退出调用。清单3 中 ExceptionHandler::SingleTonHandler::Handler() 函数的末尾处展示了该处理程序。 结束语我简单地讨论了少许 C++ 编程设计模式,以便更好地执行以下任务: ·在抛出异常的时候追踪异常的来源。·将信号从内核程序转换成 C++ 异常。·捕获构造和/或析构全局变量期间抛出的异常。·多线程进程中的异常处理。(end)

液战多溶剂干洗机

高速用旋转护栏_公路旋转护栏_大桥防撞护栏

N30直流微型电机美容洁面仪专用带偏位轴直流马达微型电机

便携式扬尘在线检测仪颗粒物PM2.5/PM10/TSP实时监测

气刀气力输送系统稀相气力输送系统风机选型汇顺移动式除尘设

刮板输送机llca50

榆林上门回收油浸式变压器行情

安利中国市场有几个团队?安利最强的几个团队是哪些?

异形EVA雕刻肇庆异形EVA泡棉内衬定制

IntelCPUM5-6Y57SR2EG

友情链接