[英]Catch C++ exception over VCL exception routine
我想使用C ++ Builder處理所有C ++異常,以生成崩潰報告,當在客戶端安裝和使用應用程序時,該報告可以幫助我調試應用程序。
我嘗試使用功能SetUnhandledExceptionFilter,但是它不起作用,因為VCL會攔截異常,並且不會再次引發異常。
所以我嘗試了一下,但效果不佳:
unsigned int Filter( unsigned int uiExCode, EXCEPTION_POINTERS *pt )
{
// might create the crash dump....
MessageBox( NULL, L"ENFIN", L"", 0 );
return EXCEPTION_CONTINUE_SEARCH;
}
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
try
{
Application->Initialize();
Application->MainFormOnTaskBar = true;
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
__except( Filter( GetExceptionCode(), GetExceptionInformation() ) )
{
// Some code to clear
}
return 0;
}
我不想使用外部庫,例如EurekaLog或MadExcept。
有誰知道如何防止VCL捕獲所有異常?
謝謝。
在我看來,VCL和STL之間的自動映射非常重要。
將C ++異常轉換為VCL異常中描述的解決方案導致要管理兩個邏輯層次結構,因此,如果您不知道被調用的實現是VCL還是STL,則必須同時捕獲EOutOfRange
和CppStdOutOfRange
。而且這也是錯誤容易隨着框架的發展而變化。
我的建議是盡早捕獲每個“可預期的”“外部”異常,並將其轉換為您選擇的一個異常層次結構的適當異常:確保所有異常類(實際上將“遍歷”您的應用程序)繼承(大部分是間接地)來自一個基類 。
正如Hans Passant所提到的,您可能已經忘記的重要一點是,不僅捕獲應用程序設置異常(如您當前所做的那樣),而且還捕獲運行時異常(即,在方法TApplication::Run
的調用中引發的所有異常)。 )。 這只能通過分配事件Application->OnException
來完成-重新閱讀有關如何從技術上進行操作的文檔。
我對合理的全局異常處理程序的建議是顯示並記錄一條消息,然后終止該應用程序。 甚至按以下順序更好:
Application->Terminate
離開Run 模態消息框將使您被毒害的程序繼續運行-而您實際上並不知道它的作用。
據我所知,沒有簡單的方法可以實現您想要的。 這是一篇有趣的文章,提供了有關該主題的信息並探討了一些可能的解決方案: http : //www.audacia-software.de/en/bcb/external-exception-eefface.htm
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.