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

http://topic.csdn.net/t/20031023/09/2385627.html

--------------------------------------------------

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

如下代码明显不行,请哪位高手帮帮忙!!!!!!!!!!!!! 
try 

      ConnectServer(); 

catch(...) 

      NULL; 
}

回复于:2003-11-12 10:23:27

问题我已自己解决,本想早点上来跟大家讨论讨论,但....一拖就到了现在:( 
现将自己在这方面的一点简单的见解说出来,希望能给有需要的朋友一点提示。

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中的数据等.

以上为未处理异常的一个大概的重点内容,有机会我将贴出我查阅的各部分关于异常的文章,希望起抛砖引玉之功效。以上皆是新手个人见解,如有不当还望高手指正。

http://www.cnblogs.com/-clq/archive/2012/01/09/2316799.html

时间: 2024-12-25 23:23:49

bcb 如何在DLL中捕捉系统级异常的相关文章

结构化异常处理(三)系统级异常和应用程序级异常

一.系统级异常 1.准去的说,.NET平台引发的一场应被称为系统异常.这些异常被认为是无法修复的致命错误. 2.系统异常直接派生自名为System.SystemException的基类,该基类派生自System.Exception. SystemException除了一组自定义的构造函数不添加任何功能. public class SystemException :  Exception { //各种构造函数 } 3.当一个异常类型派生自System.SystemException时,我们就能够判

如何在TFS中恢复系统默认查询”已指派给我”的设置(TFS 2013)

故事是这样开始的,一天开发人员求助说,在浏览器中修改了系统默认的工作项查询"已指派给我"的后,发现这个查询每次都提示超时,并且没有办法恢复到初始的设置状态,因为出现超时提示以后,查询编辑器就无法使用,如下图: 找遍了所有可以编辑工作项查询的工具,Visual Studio, Eclipse都没有看到可以编辑系统默认查询的功能.即使在浏览器中使用"另存为"的方法把"已指派给我"保存为另外一个查询,也无法恢复系统默认的状态.已经觉得自己黔驴技穷了,并

如何在C#中自定义自己的异常

在C#中所有的异常类型都继承自System.Exception,也就是说,System.Exception是所有异常类的基类. 总起来说,其派生类分为两种:1. SystemException类: 所有的CLR提供的异常类型都是由SystemException派生.2. ApplicationException类: 由用户程序引发,用于派生自定义的异常类型,一般不直接进行实例化. 创建自定义异常类应严格遵循几个原则1. 声明可序列化(用于进行系列化,当然如果你不需要序列化.那么可以不声明为可序列

如何在cocos2d-x中使用ECS(实体-组件-系统)架构方法开发一个游戏?

引言 在我的博客中,我曾经翻译了几篇关于ECS的文章.这些文章都是来自于Game Development网站.如果你对这个架构方式还不是很了解的话,欢迎阅读理解 组件-实体-系统和实现 组件-实体-系统. 我发现这个架构方式,是在浏览GameDev上的文章的时候了解到的.很久以前,就知道了有这么个架构方法,只是一直没有机会自己实践下.这一次,我就抽空,根据网上对ECS系统的讨论,采用了一种实现方法,来实现一个. 我很喜欢做游戏,所以同样的,还是用游戏实例来实践这个架构方法.我将会采用cocos2

Android 捕捉app系统中未处理的异常

一:为什么要处理? 其实我们都知道,在开发过程中,自己的app系统或许有许多隐藏的异常,自己没有捕捉到,那么关于异常的捕捉,这是相当重要的,如果系统发生崩溃,那么至少也可以让系统挂在系统之内,不会发现什么系统直接退了,或者是卡死,这样做,能够使得用户体验效果更加,自己也可以发现用户到底出现什么异常,便于自己以后好处理这个问题,优化处理自己的系统. 二:如何解决 在Android 开发中,自身其实带有一个系统默认的异常处理接口,UncaughtExceptionHandler,该接口呢,能够很好的

解决 “MoveFile”: 类型库“XXX.dll”中的标识符已经是宏;使用“rename”限定符 类型库符号与系统符号冲突问题

今天在VS工程当中引入一个组件,编译的时候出现警告, “MoveFile”: 类型库“XXX.dll”中的标识符已经是宏:使用“rename”限定符.虽然只是一个警告,但看着实在不爽,更重要的是,警告在某些情况下,可能正是bug的来源,并且这类bug往往非常难以定位.废话不多话,下面来解决问题. 看编译器给出的提示,是告诉我们,类型库当中的符号和系统符号有重名,同时也给出了解决方法,就是使用rename.怎么个rename法呢?其实很简单,我们在导入类型类的时候,直接#import语句后面,通过

如何在MFC DLL中向C#类发送消息

如何在MFC DLL中向C#类发送消息 一. 引言 由于Windows Message才是Windows平台的通用数据流通格式,故在跨语言传输数据时,Message是一个不错的选择,本文档将描述如何在MFC DLL中向C#窗口类发送消息. 二. 实现过程 1. 新建一个基于MFC的DLL工程,在工程作用是用于生成Dll库函数: 2. 在该工程中新增一个类,CMessager: 3. 在头文件中添加代码如下: 1 #define ZS_API extern "C" _declspec (

Visual Studio中根据系统区分引用64位、32位DLL动态库文件的配置方法

原来使用Win7的32位系统,进行C#工程的开发,后来重装系统,换成了win7的64位系统 调试原来的工程,由于在其中引用了"SQLite"的32位的dll,导致在64为位下程序无法运行(但是编译可以通过) 后来通过修改工程文件(.csproj),在其中设置引用的条件,解决了问题 打开引用了SQLite的工程(例如叫做info)的工程文件(info.csproj),找到对SQLite引用的语句,类似如下的代码 代码如下: <Reference Include="Syst

如何在C#中引入CPLEX的dll(CPLEX系列-教程一)

以前写在CSDN上的文章.转到博客园之后,打算把这个教程移过来,顺便完善后面的教程.主要是在Asp.Net+EF6里面使用cplex,完成一个最优生产计划的决策.当时在查找如何在C#中引用cplex时,找到的大多是cplex在VS中的环境配置,大都还是以C++为例,而且觉得有些复杂.所以想写一篇关于C#引用的教程. 关于下载 我下载的版本是cplex studio12.8.0,可以去官网注册账号并下载试用版或者教育版.其他下载途径自行百度. 安装 下载之后,新建一个文件夹以备安装使用.可以不用安