×
Namespaces

Variants
Actions

TRAPs和Leaves

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

文章
huwell 在 28 Jun 2007 创建
最后由 hamishwillee 在 15 Dec 2011 编辑

在开始接触symbian的过程中,可能对symbian平台特有异常处理机制感到很困惑,下面是篇newlc提供的文章,主要谈这方面的问题,大家可以参考下:


如果你是symbian编程的初学者,那可以看到在代码中上带L、LC或LD后缀的函数使用很普遍。这些后缀有如下重要含义:

  • L表明这个函数可能异常退出(Leave)
  • C表明这个函数将一些东西放入了清除栈(Cleanup Stack)
  • D表明这个函数拥有一个堆上分配对象的所有权(并且对它的删除负有责任)


一个异常退出(Leave)会导致当前执行函数的中断,回到第一次调用TRAP()或TRAPD()宏的函数那里,下图给出了示意:

Leave.png


一个L函数(可能会异常退出的函数)必须满足如下条件:

  • 函数里明确调用User::Leave()或者是它的派生之一(LeaveIfNull(),LeaveIfError()等)
  • 函数中调用new(ELeave)
  • 函数中调用其他L函数(不包含trap harness)


如果能满足上面任一条件,那这个函数就应该遵从规则加上L后缀。


当你去实现虚函数时这个规则是很有用的:如果该虚函数是一个L函数,那你的实现函数就可以异常退出(如CCoeControl::OfferKeyEvent(),CCoeControl::HandleCommandL()等);如果不是L函数,那你的函数将不能处理异常退出(如CCoeControl::Draw())。如果你需要调用一个L函数在你的完成函数中,那你必须使用错误陷阱(trap harness)来捕捉这个异常。如下:

void MyControl::Draw(const TRect& aRect)
{
...
TRAPD(errorcode,MyLeavingFunctionL());
...
}

(可以看出,这个是和上面所述L函数调用L函数的处理方法不同的)

This page was last modified on 15 December 2011, at 13:43.
86 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×