无法捕获该异常:Unhandled exception at 0x00000000

cgd1226 2010-01-07 08:38:18
我用MFC写了个应用程序,因为需要用到一个外部的DLL。
采用的是动态方式调用DLL的内部接口函数。

eg:

(MyConnectDev 该函数指针的详细信息略过)

myConnectDev = (MyConnectDev)::GetProcAddress(hInst, "ConnecGetDev");
// 这里故意将对应的函数名改错,以引起后面的异常!

调用如下:

try
{
int a = myConnectDev(...);
}
catch(...)
{
MessageBox(_T("捕获到该异常"));
}


该函数是可以正常调用的,但我试了下,将"ConnecGetDev"故意写错,
这时会跑出如下的异常:

Unhandled exception at 0x00000000 in MyMFCApp.exe:
0xC0000005: Access violation reading location 0x00000000.


这个异常在 catch 语句中根本无法捕获,因此很疑惑。
想问下各位该异常该如何来处理。 谢谢大家!
...全文
3342 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cgd1226 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tr0j4n 的回复:]
引用 6 楼 cgd1226 的回复:
引用 2 楼 tr0j4n 的回复:
Try this

C/C++ code
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(
  __in  LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
);


我刚学MFC(才两周左右),这个我看不懂。 呵呵。见谅哈。
能不能写全一点,怎么用这个Filter。 谢谢!


老邓的是C版的,我的是C++版的。其实效果是一样的,道理也都一样,流程也差不多。

你把这个函数Google下就会用了啊


[/Quote]

嗯。好。谢谢。
MoXiaoRab 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cgd1226 的回复:]
引用 2 楼 tr0j4n 的回复:
Try this

C/C++ code
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(
  __in  LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
);


我刚学MFC(才两周左右),这个我看不懂。 呵呵。见谅哈。
能不能写全一点,怎么用这个Filter。 谢谢!

[/Quote]
老邓的是C版的,我的是C++版的。其实效果是一样的,道理也都一样,流程也差不多。

你把这个函数Google下就会用了啊

cgd1226 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 loaden 的回复:]
C/C++ code #include<stdio.h>

#include<windows.h>// for EXCEPTION_ACCESS_VIOLATION
#include<excpt.h>int filter(unsignedint code,struct _EXCEPTION_POINTERS*ep) {

?-
[/Quote]

谢谢老邓兄。我试过了,可以用。 :)
cgd1226 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tr0j4n 的回复:]
Try this

C/C++ code
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(
__in LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
);
[/Quote]

我刚学MFC(才两周左右),这个我看不懂。 呵呵。见谅哈。
能不能写全一点,怎么用这个Filter。 谢谢!
cgd1226 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zoulie 的回复:]
呵呵,直接判断GetProcAddress函数返回值不是更好?
[/Quote]

我确实就打算这么做的。 :)
老邓 2010-01-07
  • 打赏
  • 举报
回复
 #include   <stdio.h>   

#include <windows.h> // for EXCEPTION_ACCESS_VIOLATION

#include <excpt.h>

int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep) {

puts("in filter.");

if (code == EXCEPTION_ACCESS_VIOLATION) {

puts("caught AV as expected.");

return EXCEPTION_EXECUTE_HANDLER;

}

else {

puts("didn't catch AV, unexpected.");

return EXCEPTION_CONTINUE_SEARCH;

};

}

int main()

{

int* p = 0x00000000; // pointer to NULL

puts("hello");

__try{

puts("in try");

__try{

puts("in try");

*p = 13; // causes an access violation exception;

}__finally{

puts("in finally. termination: ");

puts(AbnormalTermination() ? "\tabnormal" : "\tnormal");

}

}__except(filter(GetExceptionCode(), GetExceptionInformation())){

puts("in except");

}

puts("world");

}
zoulie 2010-01-07
  • 打赏
  • 举报
回复
呵呵,直接判断GetProcAddress函数返回值不是更好?
MoXiaoRab 2010-01-07
  • 打赏
  • 举报
回复
Try this


LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(
__in LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
);

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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