异常处理机制

来源:互联网 发布:linux双网卡配置路由 编辑:程序博客网 时间:2024/04/30 18:26

1.最初设计SymbianOS时,异常还不是C++标准的一部分.

   无论实际上是否有异常被抛出,异常处理都着实增加了编译出来的代码的大小,并增加了运行时存储器的开销.

   由于这些原因,标准C++的异常处理并不适宜添加到SymbianOS中.

   SymbianOS强调的是简洁的操作系统和客户代码,它的实现更轻量级,只适合于小型设备的约束.

   在编译基于SymbianOS的代码时,编译器被显示地设定为禁止C++异常处理,所有使用try,catch,throw关键字的地方都被标记为错误.

2.每个TRAP都对可执行文件大小,及程序执行速度有影响,每次进入和退出TRAP宏都会导致内核执行调用,并且在运行时还要分配一个结构

   体来保存异常退出发生时栈的内容.

   这些因素使用得TRAP在为一种代价不菲的异常退出处理方案了,所以在代码中尽量少使用TRAP.

3.SymbianOS中的异常退出/陷阱方法与C++中的抛出/捕获处理相似:它使用的捕获装置TRAP类似于try,catch;异常退出时,调用

   User::Leave()等,等同于throw.

4.严格的异常处理是SymbianOS保持稳定性的核心.

   清除栈是这种方法的核心,它提供了一种方式来删除在其它情况下可能不再使用的数据.

   二阶段构造保证构造方法不会异常退出.

5.传统上,函数通过返回状态码表明函数执行的结果.在SymbianOS中许多API使用该方法,但它不能满足稳定的用户体验,因为:返回码可能

   不能包括所有的情况;调用函数可能不知道如何处理特殊的错误.

   异常退出可引起函数的立即退出,它不能被忽略.进程沿着嵌套调用链向上持续进行,直到遇到陷阱.

 

   异常退出即leave,是由于程序因在各种情况下调用了User::Leave()等函数而产生的。

6.TRAP宏。使用TRAP捕获会可能会Leave的函数。它接收leave码。Leave终止于TRAP。总是TRAP以L结尾的函数。

7.CleanupStack清除栈。如果函数发生异常退出,在该函数中压到清理栈上的每个指针,在该函数退出前,全部都被弹出并释放。清理栈在弹出栈顶元素之前,先要回收该元素所指向的内存空间,从而充分保证程序在执行过程中不会发生内存泄露。

    清除栈解决的是自动变量指针分配内存后,程序异常退出,时的删除问题。

   对于对象的一长串函数调用,清除栈工作的非常好。

8.二阶段构造的目的是:在构造一个局部堆变量时,防止在构造函数中成员分配失败后,导致本对象占用的空间没有机会删除。因为在堆上给这个对象分配空间,对象中的成员占用的空间也是在堆上。

 

9.CBase派生类不应作为自动变量在栈上分配。

 

1.继承于CBase的类的构造函数放在私有段中,而在传统的c++中它放在公有段中,这样做的原因是CBase类的对象必须放在堆上,避免在栈上生成它。

2.在析构函数中不要有带异常退出的代码。

  比如,若在析构函数中使用

  CleanupStack::PushL();
  CleanupStack::PopAndDestroy();可能会报E32User-CBase 66错误。

3.