工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 技术跟踪 > Linux开发 > 正文
Linux 下 C++程序的异常处理技巧
[文章信息]
作者:Agrawal
时间:2005-03-11
出处:blog
责任编辑:方舟
[文章导读]
处理 C++ 中的异常会在语言级别上遇到少许隐含限制,但在某些情况下,您可以绕过它们
advertisement
专题教程宝典
【软件应用】
【办公软件】
【图形图像】
【网页制作】
【操作系统】
【网络安全】
【程序开发】
【日报周刊】
【多媒体教程】
· 天极软件应用多媒体教程
· 中搜网络猪风行天下使用感受
· 数字证书使用一点通
· 软件消费服务信息指南
· EJB 3.0 开发指南
· 软件盗版与反盗版之战
· 图解PS按比例自动批量裁剪照片
· Windows开机关机故障分析及排除
· Visual FoxPro9.0构建管理系统图解
· 体验面对面的网络视频通讯
[正文]

1 2  下一页

  处理 C++ 中的异常会在语言级别上遇到少许隐含限制,但在某些情况下,您可以绕过它们。学习各种利用异常的方法,您就可以生产更可靠的应用程序。

  保留异常来源信息

  在 C++中,无论何时在处理程序内捕获一个异常,关于该异常来源的信息都是不为人知的。异常的具体来源可以提供许多更好地处理该异常的重要信息,或者提供一些可以附加到错误日志的信息,以便以后进行分析。

  为了解决这一问题,可以在抛出异常语句期间,在异常对象的构造函数中生成一个堆栈跟踪。ExceptionTracer 是示范这种行为的一个类。

  清单 1. 在异常对象构造函数中生成一个堆栈跟踪

// Sample Program:
// Compiler: gcc 3.2.3 20030502
// Linux: Red Hat

#include <execinfo.h>
#include <signal.h>

#include <exception>
#include <iostream>

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 < nSize; i++)
   {
    cout << symbols[i] << endl;
   }

  free(symbols);
 }
};

  管理信号

  每当进程执行一个令人讨厌的动作,以致于 Linux? 内核发出一个信号时,该信号都必须被处理。信号处理程序通常会释放一些重要资源并终止应用程序。在这种情况下,堆栈上的所有对象实例都处于未破坏状态。另一方面,如果这些信号被转换成 C++ 异常,那么您可以优雅地调用其构造函数,并安排多层 catch 块,以便更好地处理这些信号。

  清单 2 中定义的 SignalExceptionClass,提供了表示内核可能发出信号的 C++ 异常的抽象。SignalTranslator 是一个基于 SignalExceptionClass 的模板类,它通常用来实现到 C++ 异常的转换。在任何瞬间,只能有一个信号处理程序处理一个活动进程的一个信号。因此,SignalTranslator 采用了 singleton 设计模式。整体概念通过用于 SIGSEGV 的 SegmentationFault 类和用于 SIGFPE 的 FloatingPointException 类得到了展示。

  清单 2. 将信号转换成异常
  
template <class SignalExceptionClass> 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<SegmentationFault> g_objSegmentationFaultTranslator;

// An example for SIGFPE
class FloatingPointException : public ExceptionTracer, public exception
{
 public:
  static int GetSignalNumber() {return SIGFPE;}
};

SignalTranslator<FloatingPointException> g_objFloatingPointExceptionTranslator;


1 2  下一页

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • 将Linux代码移植到Windows的简单方法
  • Linux上搭建C/C++IDE开发环境
  • Linux上的C/C++编译器gcc/egcs详解
  • Linux后门技术及实践
  • 编写Linux实用程序的艺术
  • 张庆松:驳斥英特尔贝瑞特WiFi事实存在说
  • 联想收购IBM个人电脑业务通过美国政府审查
  • 7亿美元融资搁浅 中芯国际可能向日本采购
  • 雅虎与MSN将在搜索广告业务上分道扬镳
  • 8848遭4起连环起诉 混战意在分食中文搜索
  • 海信赢得HiSense归 与西门子商标争议和解
  • 国产手机直供风波调查 零售商空手套白狼
  • 日本判英特尔不正当竞争 中国公司未受影响
  • Advertisement

    天极无线


    奇妙科幻|美好风光|清风车影|漫画卡通|星座生肖|明星写真|动物世界
    老鼠爱大米
    挥着翅膀的女孩
    女人味
    栀子花开
    白月光
    刚刚好
    江南
    快乐崇拜
    亲爱的你怎么不在我身边
    小薇
    2002年的第一场雪
    有多少爱可以重来
    我的地盘
    七里香
    情人
     
    老鼠爱大米 老板电话
    冲动的惩罚 七里香
    我不是黄蓉 女生撒娇
    盛夏的果实 坚持到底
    孤单北半球 眉飞色舞
    挪威的森林 可爱女人
    最浪漫的事 老板电话

    CSEEK搜索