Symbian OS C++学习笔记2异常退出

Ch2. 异常退出(Leave)
------------------------------
替代:设计“异常退出”作为一种简单高效的轻量级异常处理机制。
原因:1,最初设计Symbian OS时,异常还不是C++标准的一部分;2,异常处理增加了编译出来的代码的大小,并带来了运行时存储器的开销;3,Symbian OS强调的是“简介的操作系统和客户代码”,编译器被显式地设定为禁止C++异常处理。
何时:1,调用了xxxL()而没有捕获模块;2,调用了系统函数,如User::Leave()、User::LeaveIfError()、User::LeaveIfNull();3,使用了以ELeave为参数的new操作符重载形式(参Ch2.2)。
标识:以L为后缀的函数。
工具:LeaveScan可用于检查没有正确命名的异常退出函数。
------------------------------
Ch2.2使用new(ELeave)进行基于堆的内存分配(以ELeave为参数的new操作符重载)
示例:CClanger* InitClangerL() {
 CClanger* clanger = new (ELeave) CClanger();
 CleanupStack::PushL(clanger);
 clenger->InitializeL();
 CleanupStack::Pop(clanger);//【虎.无名】PopAndDestory(clanger)将调用析构函数使其完全失效。
 return (clanger);
}
//摘自e32std.h
enum TLeave { ELeave };  inline TAny* operator new(TUint aSize, TLeave);
//e32std.inl
inline TAny* operator new(TUint aSize, TLeave) { return User::AllocL(aSize); }
------------------------------
Ch2.3 构造函数和析构函数(不允许发生异常退出)
------------------------------
Ch2.5 用宏TRAP和TRAPD捕获异常退出,后者申明了result变量,注意多重TRAP/D嵌套问题
TInt result; TRAP(result, MayLeaveL()); if(KErrNone!=result) { /*...*. }
等价于:TRAPD(result, MayLeaveL()); if(KErrNone!=result) { /*...*. }
使用TRAP式一种昂贵的处理异常退出的办法(可执行文件大小、执行速度,导致“内核执行调用”TTrap::Trap()和TTrap::UnTrap())。应当经可能减少使用TRAP的数量(方法:1)直接抛出;2)调整代码,集中处理xxxL()函数,然后统一TRAP),但每个程序中至少有一个TRAP。
一个原则确保错误处理(异常退出、返回错误代码)的一致性(二选一)
------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值