我想使用 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,则必须同时捕获 EOutOfRange
和 CppStdOutOfRange
...而且随着框架的发展,它也很容易出错。
我的建议是尽早捕获每个“预期”“外部”异常,并将其转换为您选择的一个异常层次结构的适当异常:确保所有异常类(即实际上会“飞行”通过您的应用程序)从一个基类继承(主要是间接)。
您可能忘记的一个重要点是,正如 Hans Passant 提到的,不仅要捕获应用程序设置异常(就像您当前所做的那样),还要捕获运行时异常(即方法调用中抛出的所有异常<强>TApplication::Run
)。这只能通过分配事件 Application->OnException
来完成 - 重新阅读有关如何从技术上执行此操作的文档。
我对合理的全局异常处理程序的热情建议是显示并记录一条消息,然后终止应用程序。或者按这个顺序更好:
- 记录消息
- 将其存储到全局缓冲区
- 通过调用
Application->Terminate
退出运行 - 在main中显示消息框
模态消息框将使您的中毒程序继续运行 - 而您并不真正知道它的作用。
关于c++ - 通过 VCL 异常例程捕获 C++ 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19045629/