我有一个 3rd 方 C 库,它可能会因 CRT 错误而崩溃。在这种情况下,整个过程会崩溃。有什么方法可以捕获所有 CRT 错误并防止进程终止。
3 回答
防止崩溃可能只是延迟问题。
想象一下,您可以防止崩溃,但是结果,用户会将不正确的数据保存回数据库,或者损坏数据文件,那么您只会使问题变得更糟。
相反,请尝试找出确切的问题是什么:
- 您是否将不正确的参数传递给第 3 方库中的函数?
- 还是第 3 方库中的错误?与错误的库制造商对抗。
或者:
- 尝试找到解决问题的方法
- 找到图书馆的替代品
编辑: 老实说,我去年遇到了同样的情况,第 3 方组件。我所做的是以下内容:
首先,使用_try / _except 构造来解决问题。这仅在您知道它在哪个函数调用中完全崩溃时才有效。它是这样工作的:
__try
{
Some3rdPartyLibraryFunction();
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
}
其次,为了防止您的应用程序进一步损坏,请确保您的应用程序中不再调用第三方库。例如假设库是一个报表组件,那么如果你遇到崩溃,就不要再让用户打开报表了,像这样:
bool MyClass::openReport (char *reportname)
{
if (!reportModuleEnabled)
return false;
__try
{
OpenTheReport(reportname);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
// Tell the user about the problem and prevent further access to the library
ShowMessage ("Sorry, no more reports");
reportModuleEnabled = false;
return false;
}
return true;
}
您的程序在 Windows 上运行?你试过用 SEH 包装有问题的代码吗? http://msdn.microsoft.com/en-us/library/windows/desktop/ms680657(v=vs.85).aspx
真可惜,没有人明白这一点。CRT 错误与 SEH 无关,因此无法通过_try ... _except 捕获。您应该使用 _set_invalid_parameter_handler 和 _set_purecall_handler 函数来处理 CRT 错误。
http://crashrpt.sourceforge.net/docs/html/exception_handling.html