×
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.
107 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.

×