我想用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捕获所有异常吗?
感谢。
答案 0 :(得分:1)
在我看来,VCL和STL之间的自动映射非常重要。
Translate C++ Exceptions to VCL Exceptions中描述的解决方案导致管理两个逻辑层次结构,因此如果您不知道被调用的实现是否是,则必须同时捕获EOutOfRange
和CppStdOutOfRange
VCL或STL ......随着框架的发展,它也容易出错。
我的建议是尽早捕获每个“可预期的”“异常”异常并将其转换为您选择的一个异常层次结构的相应例外:确保所有异常类(即实际上将“飞过”您的应用程序)从一个基类继承(主要是间接)。
您可能忘记的一个重点是,正如Hans Passant所提到的,不仅要捕获应用程序设置异常(正如您当前所做的那样),还要捕获运行时异常(即在方法调用中抛出的所有异常<强> TApplication::Run
强>)。这只能通过分配事件Application->OnException
来完成 - 重新阅读有关如何在技术上做到这一点的文档。
我对合理的全局异常处理程序的热烈建议是显示并记录消息,然后终止应用程序。或者按此顺序更好:
Application->Terminate
模态消息框将使您的中毒程序保持运行 - 而您实际上并不知道它的作用。
答案 1 :(得分:1)
据我所知,没有直接的方式来实现你想要的。这是一篇有趣的文章,提供有关该主题的信息,并探讨了一些可能的解决方案:http://www.audacia-software.de/en/bcb/external-exception-eefface.htm