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

标签 c++ exception 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 捕获所有异常吗?

谢谢。

最佳答案

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

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

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

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

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

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

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

关于c++ - 通过 VCL 异常例程捕获 C++ 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19045629/

相关文章:

c++ - 具有两个定界符的字符串流

c++ - 是否可以执行范围添加更新,将线性函数添加到最大段树?

c++ - 矩形类

c++ - 点运算符和范围解析运算符有什么区别

c++ - 将 C++ 常量暴露给虚幻中的蓝图

c# - 如何解决System.Unauthorized 访问异常?

delphi - 在快速绘画周期中使用释放的对象的异常(exception)

android - Android Studio新建项目(virtualToIoFile)空指针异常

c++ - 在运行时动态创建多个框架时出错(C++,FMX,IDE:C++ Builder)

c++ - 读取 Firebird 存储过程的返回值