C++的可移植性和跨平台开拓[3]:异常处理惩罚
当前位置:以往代写 > C/C++ 教程 >C++的可移植性和跨平台开拓[3]:异常处理惩罚
2019-06-13

C++的可移植性和跨平台开拓[3]:异常处理惩罚

C++的可移植性和跨平台开拓[3]:异常处理惩罚

上一个帖子“语法”由于篇幅有限,没来得及聊异常,此刻把和异常相关的部 分单独拿出来说一下。

★小心new分派内存失败

早期的老式编译器生成的代码,假如new失败会返回空指针。我当年用的Borland C++ 3.1 好像就是这样的,此刻这种编译器应该不多见了。假如你今朝用的编译器尚有这种行为,那 你就惨了。你可以思量重载new操纵符来抛出bad_alloc异常,便于举办异常处理惩罚。

稍微新式一点的编译器,就不是仅仅返回空指针了。当new操纵符发明内存弥留,凭据标 准的划定(拜见03尺度18.4.2章节),它应该去挪用new_handler函数(原型为typedef void (*new_handler)();)。尺度发起new_handler函数干如下三件事:1、设法去多搞点内存来; 2、抛出bad_alloc异常;3、挪用abort()可能exit()退出历程。由于new_handler函数是可以 被从头配置的(通过挪用set_new_handler),所以上述的行为它都大概有。

综上所述,new分派内存失败,有大概三种大概:1、返回空指针;2、抛出异常;3、历程 当即终止。假如你但愿你的代码具有较好的移植性,你就得把这三种环境都思量到。

★慎用异通例格

异通例格在我看来不是一个好对象,不信可以去看看《C++ Coding Standards – 101 Rules, Guidelines & Best Practices》的第75条。(详细有哪些弊端今后专门开一个 C++异常和错误处理惩罚的帖子来聊)言归正传,凭据尺度(拜见03尺度18.6.2章节),假如一个 函数抛到外面的异常没有包括在该函数的异通例范中,那么应该挪用unexcepted()。可是并 非所有编译器生成的代码都遵守尺度(好比某些版本的VC编译器)。假如你的需要支持的编 译器在异通例范上的行为纷歧致,那就得思量去掉异通例范声明。

★不要跨模块抛出异常

此处说的模块是指动态库。假如你的措施包括有多个动态库,不要把异常抛到模块的导出 函数之外。究竟此刻C++还没有ABI尺度(预计未来也未必会有),跨模块抛出异常会有许多 不行预料的行为。

★不要利用布局化异常处理惩罚(SEH)

假如你从来没有传闻过SEH,那就当我没说,跳过这段。假如你以前习惯于用SEH,在你打 算写跨平台代码之前,要改掉这个习惯。包括有SEH的代码只能在Windows平台上编译通过, 必定无法跨平台的。

★关于catch(…)

照理说,catch(…)语句只可以或许捕捉C++的异常范例,对付会见违例、除零错等非C++异常 是无能为力的。可是某些环境下(好比某些VC编译器),诸如会见违例、除零错也可以被 catch(…)捕捉。所以,你假如但愿代码移植性好,就不能在措施逻辑中依赖上述catch (…)的行为。

下一个帖子,筹备聊一下和“硬件有关的跨平台问题”。

原始地点:http://program-think.blogspot.com/

    关键字:

在线提交作业