伯乐共勉

讨论。NET专区
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Symbian OS 开发初级手册 5 - Leave

Posted on 2007-02-09 17:21  伯乐共勉  阅读(206)  评论(0编辑  收藏  举报
leave (不知该怎么翻译,就先叫离开吧) 这个词我们在第二课提到过, 知道它是Symbain版本的异常处理。 这一课我们详细讲解它的意义和用 法。 首先我们要明白为什么要离开? 当程序运行到一个地方无法正常继续的时候, 比如内存耗尽, 或者当前状态无法进行某个操作的时候我们不能简单的退 出程序,或者忽略这些错误。 前者使得界面不够友好, 而后者可能导致不可估计的问题。 所以我们需要在这一点上离开。 让上一层的使用我们这个函数的代 码去处理我们遇到的错误。 上一层代码可以根据但是的上下环境决定该如何处理这个错误。 

  离开的基本用法:
  
  假设我们有一个函数提取一个数组的值:
TInt GetL(TInt aIndex)
  {
  if(aIndex < 0 || aIndex >= KArraySize)
    {
    User::Leave(KErrArgument);
    }
  else
    {
    return iArray[aIndex];
    }
  }


   要使用这个函数, 我们可以:

TInt x, err;
TRAP(err, x = GetL(5);)
if(err != KErrNone)
  {
  //输出错误信息等等
  }
...

    首先注意函数名,这是一条规范: 凡是有可能离开的函数,名称都要以L结尾。这包括
在函数实现中使用任何形式的Leave (Leave, LeaveIfNull, LeaveIfError等等)和可leave的函数, 而又没有TRAP掉他们的的函数。

    以上的GetL函数当aIndex不在合法范围内的时候就会leave, KErrArgument是其原因(错误的参数)。 使用GetL函数的时候我 们可以使用TRAP宏来捕捉离开, 所以当GetL 离开的时候, 就会输出错误信息等等。 使用GetL的代码并不一定需要TRAP只要把他自己声明为 可离开的函数就可以, 但是要保证终归这些函数要被TRAP掉。 图形界面程序的框架在程序入口处提供了TRAP所以我们可以使用离开而不用TRAP一些 普遍性的问题(比如内存不足)。但是文字程序一般需要我们自己提供TRAP. 

  另外还有一点就是, TRAP这个宏必须在一个 CTrapCleanup的实例被创建以后才可以使用。 文字Helloworld中使用了头文件commonframework, 在 Examples/basics/commonframework目录下, 我们可以看到:

CTrapCleanup* cleanup=CTrapCleanup::New(); // get clean-up stack
TRAPD(error,callExampleL()); // more initialization, then do example
//TRAPD是TInt error; TRAP(error,callExampleL()); 的缩写版。
delete cleanup; // destroy clean-up stack


  也就是说当你的进程中还没有CTrapCleanup实例的时候, 你需要创建它才可以使用TRAP,当你不再使用TRAP的时候就删除这个实例。

  有了离开这个基础,我们下一课就可以讲CleanupStack 和 二层构造的概念了。 之后大家就不会觉得Symbian 程序中实例的构造看起来很复杂了。

习题:
1。 在Helloworld中创建一个可leave的函数, 并在doExampleL()中调用,看看不TRAP它的结果是什么。(也就是依靠commonframework中的TRAP) 然后再doExample 中TRAP它, 看看结果有什么不同?