簡體   English   中英

通過VCL異常例程捕獲C ++異常

[英]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,則必須同時捕獲EOutOfRangeCppStdOutOfRange 。而且這也是錯誤容易隨着框架的發展而變化。

我的建議是盡早捕獲每個“可預期的”“外部”異常,並將其轉換為您選擇的一個異常層次結構的適當異常:確保所有異常類(實際上將“遍歷”您的應用程序)繼承(大部分是間接地)來自一個基類

正如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM