结构化异常处理

lsyzh 2008-12-25 11:45:50
在Windows核心编程第四版里,25章的示例代码,讲的是结构化异常处理.
有个问题,请教各位:

void Dlg_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) {

int nRow, nCol;

switch (id) {
case IDCANCEL:
EndDialog(hwnd, id);
break;

case IDC_ROW:
// User modified the row, update the UI
nRow = GetDlgItemInt(hwnd, IDC_ROW, NULL, FALSE);
EnableWindow(GetDlgItem(hwnd, IDC_READCELL),
chINRANGE(0, nRow, g_nNumRows - 1));
EnableWindow(GetDlgItem(hwnd, IDC_WRITECELL),
chINRANGE(0, nRow, g_nNumRows - 1));
break;

case IDC_COLUMN:
// User modified the column, update the UI
nCol = GetDlgItemInt(hwnd, IDC_COLUMN, NULL, FALSE);
EnableWindow(GetDlgItem(hwnd, IDC_READCELL),
chINRANGE(0, nCol, g_nNumCols - 1));
EnableWindow(GetDlgItem(hwnd, IDC_WRITECELL),
chINRANGE(0, nCol, g_nNumCols - 1));
break;

case IDC_READCELL:
// Try to read a value from the user's selected cell
SetDlgItemText(g_hwnd, IDC_LOG, TEXT("No violation raised"));
nRow = GetDlgItemInt(hwnd, IDC_ROW, NULL, FALSE);
nCol = GetDlgItemInt(hwnd, IDC_COLUMN, NULL, FALSE);
__try {
SetDlgItemInt(hwnd, IDC_VALUE, g_ss[nRow][nCol].dwValue, FALSE);
}
__except (
g_ssObject.ExceptionFilter(GetExceptionInformation(), FALSE)) {

// The cell is not backed by storage, the cell contains nothing.
SetDlgItemText(hwnd, IDC_VALUE, TEXT(""));
}
break;

case IDC_WRITECELL:
// Try to read a value from the user's selected cell
SetDlgItemText(g_hwnd, IDC_LOG, TEXT("No violation raised"));
nRow = GetDlgItemInt(hwnd, IDC_ROW, NULL, FALSE);
nCol = GetDlgItemInt(hwnd, IDC_COLUMN, NULL, FALSE);

// If the cell is not backed by storage, an access violation is
// raised causing storage to automatically be committed,
//这里尝试去 访问没有分配内存的空间,抛异常.但是整个工程,只有一个try结构,也就是IDC_READCELL里的.
g_ss[nRow][nCol].dwValue =
GetDlgItemInt(hwnd, IDC_VALUE, NULL, FALSE);
break;
}
}


整了半天,就是搞不明白,IDC_WRITECELL操作里的异常处理入口在哪?是和READ里的共用吗?
...全文
244 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lsyzh 2008-12-31
  • 打赏
  • 举报
回复
结帖给分!
lsyzh 2008-12-26
  • 打赏
  • 举报
回复
论坛好象不提供上传文件功能.
源代码上传不了.
是<Windows核心编程第四版>第25章的示例程序.
lsyzh 2008-12-26
  • 打赏
  • 举报
回复
注释的地方没有标错.代码是先保留一块进程地址空间,但是没有映射到物理内存,所以在没完成映射之前就去访问的话,会抛异常.
GetDlgItemInt本身没有错,问题出在对g_ss[nRow][nCol].dwValue进行赋值.

后来又看了下代码,在构造函数里有对SetUnhandledExceptionFilter函数进行调用,可以设置一个自己定义的"未处理异常"函数.在不修改源代码的情况下,执行IDC_WRITECELL操作,进程不会终止,进异常处理程序.但是把SetUnhandledExceptionFilter函数相关的内容注释掉,执行IDC_WRITECELL操作,就会抛异常,进程终止.
异常处理确实挺麻烦的,初次接触,很多地方摸不着边.
多谢各位捧场.
matrixdwy 2008-12-25
  • 打赏
  • 举报
回复
还没看到这一节,不过应该是注释标错地方了
luojc714 2008-12-25
  • 打赏
  • 举报
回复
不懂!
tianjiao85 2008-12-25
  • 打赏
  • 举报
回复
没有看到这节,
我觉得
但是如果是全局函数,那是要try ..catch相应代码块,
但是如果是类的话,在类的申明时候写上throw ,GetDlgItemInt本身如果抛出异常的话,如果没有写try ...catch的话,会被类抛出。
过去的我 2008-12-25
  • 打赏
  • 举报
回复
是没有,不过系统会执行unhandledexceptionfilter ,那段代码那个.h文件里,这就是传说中的未处理异常..比较复杂
51365133 2008-12-25
  • 打赏
  • 举报
回复
是不是注释语句复制以后没有改,根本就不存在try语句,不要看注释,代码才是王道。

// 以上是比尔盖茨的回复。

你信吗?注释就是注释。
thesys 2008-12-25
  • 打赏
  • 举报
回复
这里应该没有看到异常处理,是不是外部还有异常处理的代码?

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧