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

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

 2008-11-13 19:29:21 来源:WEB开发网   
核心提示: 2.2.4、例4--Funcfurter1现在让我们来看中断处理真正展现其功能的一个例子,(见例4),Visual C++ 中的结构异常处理(5),DWORD Funcfurter1(void) {DWORD dwTemp;// 1. Do any processing here...._

2.2.4、例4--Funcfurter1

现在让我们来看中断处理真正展现其功能的一个例子。(见例4)。

  DWORD Funcfurter1(void) {
  DWORD dwTemp;
  // 1. Do any processing here.
  .
  .
  .
  __try {
  // 2. request permission to access protected data, and then use it.
  WaitForSingleObject(g_hSem, INFINITE);
  dwTemp = Funcinator(g_dwProtectedData);
  }
  __finally {
  // 3. Allow others to use protected data.
  ReleaseSemaphore(g_hSem, 1, NULL);
  }
  // 4. Continue processing.
  return (dwTemp);
  }

例4 Funcfurter1函数代码

设想try程序段内调用的Funcinator函数具有某种缺陷而造成无效内存读写。在16位视窗应用程序中,这会导致一个已定义好的错误信息对话框出现。在用户关闭对话框的同时该应用程序也终止运行。在不具有try-finally的Win32应用程序中,这会导致程序终止运行,指示灯信号永远不会得到释放。这就造成了等待该指示灯信号的其它线程会永远等待下去。而将ReleaseSemaphore放在finally程序段内则从根本上保证了不论何种情况出现指示灯信号都会得到释放。

如果中断处理句柄能够处理由于无效内存读写而造成的程序中断,我们就完全有理由相信它能够处理诸如setjump/longjump、break和continue这类的中断转移。事实也正是这样。

2.3、小测试

下面一个例子(见清单五)请读者猜测一下函数FuncaDoodleDoo的返回值。(答案为14)

  DWORD FuncaDoodleDoo(void) {
  DWORD dwTemp = 0;
  while (dwTemp 〈 10) {
  __try {
  if (dwTemp == 2)
  continue;
  if (dwTemp == 3)
  break;
  }
  __finally {
  dwTemp++;
  }
  dwTemp++;
  }
  dwTemp += 10;
  return (dwTemp);
  }
  FuncaDoodleDoo函数代码

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

Tags:Visual 结构 异常

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