0

0

C++程序的异常处理技巧

黄舟

黄舟

发布时间:2016-12-16 09:42:16

|

1325人浏览过

|

来源于php中文网

原创

处理 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
{

cout
} free(symbols);

}

}; 治理信号 每当进程执行一个令人讨厌的动作,以致于 linux? 内核发出一个信号时,该信号都必须被处理。信号处理程序通常会释放一些重要资源并终止应用程序。在这种情况下,堆栈上的所有对象实例都处于未破坏状态。另一方面,假如这些信号被转换成c++ 异常,那么您可以优雅地调用其构造函数,并安排多层 catch 块,以便更好地处理这些信号。 清单 2 中定义的 signalexceptionclass,提供了表示内核可能发出信号的 c++ 异常的抽象。signaltranslator 是一个基于 signalexceptionclass 的模板类,它通常用来实现到 c++ 异常的转换。在任何瞬间,只能有一个信号处理程序处理一个活动进程的一个信号。因此,signaltranslator 采用了 singleton 设计模式。整体概念通过用于 sigsegv 的 segmentationfault 类和用于 sigfpe 的floatingpointexception 类得到了展示。 清单 2. 将信号转换成异常



template 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
}

catch (floatingpointexception &)

{

cout
}

catch (...)

{

cout
} //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++ 异常。

·捕捉构造和/或析构全局变量期间抛出的异常。

·多线程进程中的异常处理。

以上就是C++程序的异常处理技巧的内容,更多相关文章请关注PHP中文网(www.php.cn)!

EnableDTS公文传输管理系统3.0
EnableDTS公文传输管理系统3.0

公文是政府与企事业单位处理公务和行政管理工作的重要工具,在各级行政单位中,`办公`的一个重要内容就是办理和制发文件,即`办文`,办文是每个行政管理单位大量日常的工作。借助新的网络信息技术对公文进行高效有序的电子化处理,是办公自动化建设的重要组成部分,也是关系到电子化办公系统建设全局的基础性工程。

下载

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

28

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

7

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

2

2026.01.31

漫画防走失登陆入口大全
漫画防走失登陆入口大全

2026最新漫画防走失登录入口合集,汇总多个稳定可用网址,助你畅享高清无广告漫画阅读体验。阅读专题下面的文章了解更多详细内容。

8

2026.01.31

php多线程怎么实现
php多线程怎么实现

PHP本身不支持原生多线程,但可通过扩展如pthreads、Swoole或结合多进程、协程等方式实现并发处理。阅读专题下面的文章了解更多详细内容。

1

2026.01.31

php如何运行环境
php如何运行环境

本合集详细介绍PHP运行环境的搭建与配置方法,涵盖Windows、Linux及Mac系统下的安装步骤、常见问题及解决方案。阅读专题下面的文章了解更多详细内容。

0

2026.01.31

php环境变量如何设置
php环境变量如何设置

本合集详细讲解PHP环境变量的设置方法,涵盖Windows、Linux及常见服务器环境配置技巧,助你快速掌握环境变量的正确配置。阅读专题下面的文章了解更多详细内容。

0

2026.01.31

php图片如何上传
php图片如何上传

本合集涵盖PHP图片上传的核心方法、安全处理及常见问题解决方案,适合初学者与进阶开发者。阅读专题下面的文章了解更多详细内容。

2

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 3.7万人学习

MySQL 教程
MySQL 教程

共48课时 | 2万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号