通过VCL异常例程捕获C ++异常

时间:2013-09-27 07:56:52

标签: c++ exception-handling c++builder vcl

我想用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捕获所有异常吗?

感谢。

2 个答案:

答案 0 :(得分:1)

在我看来,VCL和STL之间的自动映射非常重要。

Translate C++ Exceptions to VCL Exceptions中描述的解决方案导致管理两个逻辑层次结构,因此如果您不知道被调用的实现是否是,则必须同时捕获EOutOfRangeCppStdOutOfRange VCL或STL ......随着框架的发展,它也容易出错。

我的建议是尽早捕获每个“可预期的”“异常”异常并将其转换为您选择的一个异常层次结构的相应例外:确保所有异常类(即实际上将“飞过”您的应用程序)从一个基类继承(主要是间接)。

您可能忘记的一个重点是,正如Hans Passant所提到的,不仅要捕获应用程序设置异常(正如您当前所做的那样),还要捕获运行时异常(即在方法调用中抛出的所有异常<强> TApplication::Run )。这只能通过分配事件Application->OnException来完成 - 重新阅读有关如何在技术上做到这一点的文档。

我对合理的全局异常处理程序的热烈建议是显示并记录消息,然后终止应用程序。或者按此顺序更好:

  • 记录消息
  • 将其存储到全局缓冲区
  • 通过致电Application->Terminate
  • 离开Run
  • 在主
  • 中显示消息框

模态消息框将使您的中毒程序保持运行 - 而您实际上并不知道它的作用。

答案 1 :(得分:1)

据我所知,没有直接的方式来实现你想要的。这是一篇有趣的文章,提供有关该主题的信息,并探讨了一些可能的解决方案:http://www.audacia-software.de/en/bcb/external-exception-eefface.htm