博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于 cleanup stack 和 two phase consturction [1](转)
阅读量:2503 次
发布时间:2019-05-11

本文共 2017 字,大约阅读时间需要 6 分钟。

1、什么是leave ?

因为symbian OS运行在手持设备上,资源有限并且要求长时间无故障运行。所以Symbian的资源管理方法和传统PC有很大不同。如果Symbian OS 应用程序的函数由于某些原因导致失败,超出了程序员的控制(比如:试图打开一个不存在的文件),这个时候函数就有可能leave。在Symbian OS中,对函数来说,leave和传统的C++和java中的抛出异常类似(throwing anexception)。

A "Leave" causes execution of the active function to terminate, and on through all calling functions, until the first function is found that contains a TRAP() or TRAPD() macro

“Leave” 可以使函数终止并回退,直到找到第一个包含宏 TRAP() 或 TRAPD()的函数为止。

2、Symbian OS的异常处理

Symbian OS不使用传统的C++类型的异常处理机制(如:try,catch和throw),而是有自己的处理机制:

?Trap 和TrapD,这样允许代码运行在trap harness之中。

?使用User::Leave()显式地说明异常的处理。通常,所有直接或者间接地产生Leave的函数,名字都有一个L后缀。

2.1使用Trap和TrapD

使用Trap和TrapD是定义了一个当函数发生leave时可以返回的代码点(point in code)。其不同的宏定义如下所示:

Trap

TRAP(_r,_s) {TTrap __t; if (__t.Trap(_r)==0) {_s;TTrap::UnTrap();} }

TrapD

TRAPD(_r,_s) TInt _r; {TTrap __t; if (__t.Trap(_r)==0) {_s;TTrap::UnTrap();} }

可以看出TrapD仅仅是比Trap多定义了一个error code的变量。如果代码段_S发生了leave,那么错误代码存放在_r中,否则,_r的值为KErrNone。对于_S来说,通常为一个函数调用不同的用法如下所示:

Trap的使用

// 定义一个leave 变量,类型为TInt

TInt r=0;
// 执行某个函数,如果发生leave,leave代码保存在r中。
TRAP(r,doExampleL());
// 检查leave变量,看看是否leave;发生 leave 时,r 为非0值
if (r)
testConsole.Printf(_LIT("Failed: leave code=%d"), r);

TrapD的使用

// 调用函数,同时定义leave code变量

TRAPD(leaveCode,SomeFunctionL());
// 检查leave code变量,看函数是否leave
if (leaveCode!=KErrNone)
{
// 如果leave,作一些清除工作。
}

从上面可以看出,Trap和TrapD是基本相同的原理,只是TrapD更加简单使用。

2.2 使用User::LeaveXXX()

Leaves 可能由系统的内部错误触发,也可能由程序员显式地触发。有以下几种方式显式地(explicitly)触发。

·User::LeaveIfError():带着一个error code调用,如果error code不是KerrNone,那表明函数发生了leave。
·User::LeaveNoMemory()
·User::LeaveIfNull():一个指针变量作为参数,如果指针为NULL,那么函数leave
·User::Leave() 不检查任何事项。仅仅leave。

3、总结

Trap/Leave和传统的C++的异常处理不同之处在于,symbian仅仅返回一个TInt类型的错误代码(error code),而C++的异常处理可以抛出(throw)任何对象。也就是说,symbian的两种异常处理方式仅仅对抛出的error code的类型作处理。
一个函数的Leave可以由两种情况产生,一种由系统触发,另外一种由程序员触发(利用User::Leave()和其派生函数)。当leave发生时。系统会遍历所有调用的函数,直到发现Trap和TrapD为止。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-126410/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10294527/viewspace-126410/

你可能感兴趣的文章
必须掌握的前端模板引擎之art-template
查看>>
vue项目实现列表页-详情页返回不刷新,再点其他菜单项返回刷新的需求
查看>>
初学者持续自我提升指南
查看>>
树莓派进阶之路 (016) - 通过595驱动4位LED显示系统时间
查看>>
docker 部署nginx 使用keepalived 部署高可用
查看>>
性能测试需求分析
查看>>
MySQL 8.0索引合并
查看>>
P2782 友好城市
查看>>
Install OpenStack Kilo Dashboard wiht Nginx + uWSGI On RHEL7.1
查看>>
响应式网页设计
查看>>
数组各元素出现的次数
查看>>
我的读书清单(持续更新)
查看>>
53.Maximum Subarray
查看>>
xlistview(脚)
查看>>
咖啡豆(JavaBean)•香
查看>>
hdu2457 Trie图+dp
查看>>
杭电2075
查看>>
ASP.NET Core ---日志
查看>>
Scrapy-redis实现分布式爬取的过程与原理
查看>>
ASP.NET Core 介绍和项目解读
查看>>