WEB开发网
开发学院软件开发VC Visual C++ 中的结构异常处理 阅读

Visual C++ 中的结构异常处理

 2008-11-13 19:29:21 来源:WEB开发网   
核心提示: 在finally程序段内的代码被执行后,函数Funcenstein2立即返回,Visual C++ 中的结构异常处理(4),这样,因为try程序段内的return返回语句,同样,由于goto语句打断了从try程序段到finally程序段的自然流程,任何finally程序段后的代码都不会被执

在finally程序段内的代码被执行后,函数Funcenstein2立即返回。这样,因为try程序段内的return返回语句,任何finally程序段后的代码都不会被执行。因而Funcenstein2返回值是5,而不是9。

必须指出的是,当遇到例2中这种过早返回语句时,编译器需要产生额外的代码以保证finally程序段内的代码的执行。此过程称作为局域展开。当然,这必然会降低整个程序的效率。所以,你应该尽量避免使用这类代码。在后面我们会讨论关键词__leave,它可以帮助我们避免编写出现局域展开一类的代码。

2.2.3、例3--Funcenstein3

现在让我们对Funcenstein2做进一步改动,看看会出现什么情况(见例3)。

  DWORD Funcenstein3(void) {
  DWORD dwTemp;
  // 1. Do any processing here.
  .
  .
  .
  __try {
  // 2. request permission to access protected data, and then use it.
  WaitForSingleObject(g_hSem, INFINITE);
  g_dwProtectedData = 5;
  dwTemp = g_dwProtectedData;
  // Try to jump over the finally block.
  goto ReturnValue;
  }
  __finally {
  // 3. Allow others to use protected data.
  ReleaseSemaphore(g_hSem, 1, NULL);
  }
  dwTemp = 9;
  // 4. Continue processing.
  ReturnValue:
  return (dwTemp);
  }
  例3 Funcenstein3函数代码

在函数Funcenstein3中,当遇到goto语句时编译器会产生额外的代码以保证finally程序段内的代码得到执行。但是,这一次finally程序段后ReturnValue标签后面的代码会被执行,因为try或finally程序段内没有返回语句。函数的返回值是5。同样,由于goto语句打断了从try程序段到finally程序段的自然流程,程序的效率会降低。

上一页  1 2 3 4 5 6  下一页

Tags:Visual 结构 异常

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接