bcb 如何在DLL中捕捉系统级异常
生活随笔
收集整理的這篇文章主要介紹了
bcb 如何在DLL中捕捉系统级异常
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
bcb 如何在DLL中捕捉系統級異常
現將自己在這方面的一點簡單的見解說出來,希望能給有需要的朋友一點提示。
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中的數據等.
以上為未處理異常的一個大概的重點內容,有機會我將貼出我查閱的各部分關于異常的文章,希望起拋磚引玉之功效。以上皆是新手個人見解,如有不當還望高手指正。 posted on 2012-01-09 09:32 clq 閱讀(...) 評論(...) 編輯 收藏
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中的數據等.
以上為未處理異常的一個大概的重點內容,有機會我將貼出我查閱的各部分關于異常的文章,希望起拋磚引玉之功效。以上皆是新手個人見解,如有不當還望高手指正。 posted on 2012-01-09 09:32 clq 閱讀(...) 評論(...) 編輯 收藏
轉載于:https://www.cnblogs.com/-clq/archive/2012/01/09/2316799.html
總結
以上是生活随笔為你收集整理的bcb 如何在DLL中捕捉系统级异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编译php的时候,报configure:
- 下一篇: 关于火车票预定助手的声明