2

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

谢谢。

4

2 回答 2

1

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

于 2014-02-05T20:06:07.927 回答
1

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

Translate C++ Exceptions to VCL Exceptions中描述的解决方案导致要管理两个逻辑层次结构,因此您必须同时捕获两者EOutOfRangeCppStdOutOfRange如果您不知道调用的实现是 VCL 还是 STL ...而且它也容易出错,因为框架可能会演变。

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

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

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

  • 记录消息
  • 将其存储到全局缓冲区
  • 通过调用离开运行Application->Terminate
  • 在 main 中显示消息框

模态消息框将使您的中毒程序继续运行-您并不真正知道它的作用。

于 2014-02-05T12:30:30.953 回答