免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 954 | 回复: 0
打印 上一主题 下一主题

Linux 下 C++程序的异常处理技巧(源于网上) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-09-19 14:27 |只看该作者 |倒序浏览
[color="#006699"]处理C++中的异常会在语言级别上遇到少许隐含限制,但在某些情况下,您可以绕过它们。/Linux下C++程序的异常处理技巧/保留异常来源信息/管理信号/管理构造函数和析构函数中的异常/处理多线程程序中的异常/结束语/
处理 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 SIGSEGV
   class SegmentationFault : public ExceptionTracer, public
   exception
   {
   public:
   static int GetSignalNumber() {return SIGSEGV;}
   };
   SignalTranslator
   g_objSegmentationFaultTranslator;
   // An example for SIGFPE
   class 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 activity
   abort();
   // 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
   invoked
   ExceptionHandler g_objExceptionHandler;
   A g_a;
   //////////////////////////////////////////////////////////////////////////
   int main(int argc, char* argv[])
   {
   return 0;
   }
   处理多线程程序中的异常
   有时一些异常没有被捕获,这将造成进程异常中止。不过很多时候,进程包含多个线程,其中少数线程执行核心应用程序逻辑,同时,其余线程为外部请求提供服务。如果服务线程因编程错误而没有处理某个异常,则会造成整个应用程序崩溃。这一点可能是不受人们欢迎的,因为它会通过向应用程序传送不合法的请求而助长拒绝服务攻击。为了避免这一点,未捕获处理程序可以决定是请求异常中止调用,还是请求线程退出调用。清单3 中 ExceptionHandler::SingleTonHandler::Handler() 函数的末尾处展示了该处理程序。
   结束语
   我简单地讨论了少许 C++ 编程设计模式,以便更好地执行以下任务:
   ·在抛出异常的时候追踪异常的来源。
   ·将信号从内核程序转换成 C++ 异常。
   ·捕获构造和/或析构全局变量期间抛出的异常。
   ·多线程进程中的异常处理。

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/6163/showart_48302.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP