Help: 如何在DLL中捕捉系统级异常

hswu 2003-10-23 09:48:30
我创建了一个动态库,库中实现了对Socket(TCP、UDP)的封装,其中使用了BCB的TClientSocket,当使用该ClientSocket去连接一个并不存在的服务器时必然导致会ESocketError异常。
问题:我该如何捕捉到该异常?

如下代码明显不行,请哪位高手帮帮忙!!!!!!!!!!!!!
try
{
ConnectServer();
}
catch(...)
{
NULL;
}
...全文
145 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hswu 2003-11-12
  • 打赏
  • 举报
回复
问题我已自己解决,本想早点上来跟大家讨论讨论,但....一拖就到了现在:(
现将自己在这方面的一点简单的见解说出来,希望能给有需要的朋友一点提示。

1、在VCL中ESocketError异常未定义在EXCEPTION_EXECUTE_HANDLER框架中,所以try...catch(...)将不能对其捕捉。
2、但...TClientSocket的OnError事件对其异常进行了捕捉,所以可以通过处理OnError事件来处理该异常,并设置ErrorCode = 0,来返回异常标识EXCEPTION_EXECUTE_HANDLER,并完成处理
3、但...如果该TClientSocket类被动态创建并被封装与线程之中并制成动态库,重载OnError无效,无法捕捉异常(尚不明白为什么会这样...如果对动态库运作有认识的朋友不妨一起讨论讨论)。
4、不过,我们还是可以在线程起始或异常发生处使用结构性异常来定义捕捉该异常,如:
__try {...} __except(EXCEPTION_EXECUTE_HANDLER) {...}
5、其实上述的所有皆是对指定点进行异常捕捉,但是当异常通过了所有的捕捉(EXCEPTION_CONTINUE_SEARCH)时,将最终被定位在系统未定义异常处理程序中(UnhandledExceptionFilter),即显示异常对话框,这是我们的用户所不愿看到的,你可使用SetUnhandledExceptionFilter来定义自已未处理异常处理函数。这时所有的异常都在你的掌握之中了。
6、这里还有一种我们不推荐的做法,就是使用Win32提供的SetErrorModel函数并向它传递SEM_NOGPFAULTERRORBOX标识,此标识告诉进程遇到未处理异常时不再询问直接中断返回。
7、同样的还有更改注册表中的HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\AEDEBUG中的Debugger中的数据等.

以上为未处理异常的一个大概的重点内容,有机会我将贴出我查阅的各部分关于异常的文章,希望起抛砖引玉之功效。以上皆是新手个人见解,如有不当还望高手指正。
hswu 2003-10-23
  • 打赏
  • 举报
回复
sorry, 我发现了另一个问题,就是当该程序不是以动态库形式导出时,这个异常是可以捕捉,但编制成动态库后,我跟踪动态库,就发现该异常并没有被捕捉。
注:使用与不使用动态库都使用同一代码文件,所有不存在程序不同的情况。
问:谁知道为什么我在程序中能捕捉的异常做成DLL后就不能被捕捉了???
hswu 2003-10-23
  • 打赏
  • 举报
回复
补充一下,该Socket使用阻塞式连接,且被封装在一个独立的线程中。
还有人帮我吗?给点提示也好:)
hswu 2003-10-23
  • 打赏
  • 举报
回复
sorry, 我忘了说了,我还重载了OnError事件,在这个事件中我置ErrorCode=0; 结果还是出错
同时我想问一下谁对SetUnhandledExceptionFilter这个函数有较深的了解,能详细解释一下吗?
ljianq 2003-10-23
  • 打赏
  • 举报
回复
使用TClientSocket的OnError事件试试看。
fjye 2003-10-23
  • 打赏
  • 举报
回复
关注,我也很想知道怎么解决

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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