1

我有一个 3rd 方 C 库,它可能会因 CRT 错误而崩溃。在这种情况下,整个过程会崩溃。有什么方法可以捕获所有 CRT 错误并防止进程终止。

4

3 回答 3

4

防止崩溃可能只是延迟问题。

想象一下,您可以防止崩溃,但是结果,用户会将不正确的数据保存回数据库,或者损坏数据文件,那么您只会使问题变得更糟。

相反,请尝试找出确切的问题是什么:

  • 您是否将不正确的参数传递给第 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;
   }
于 2012-05-23T12:14:01.843 回答
1

您的程序在 Windows 上运行?你试过用 SEH 包装有问题的代码吗? http://msdn.microsoft.com/en-us/library/windows/desktop/ms680657(v=vs.85).aspx

于 2012-05-23T12:23:38.180 回答
1

真可惜,没有人明白这一点。CRT 错误与 SEH 无关,因此无法通过_try ... _except 捕获。您应该使用 _set_invalid_parameter_handler 和 _set_purecall_handler 函数来处理 CRT 错误。

http://crashrpt.sourceforge.net/docs/html/exception_handling.html

于 2014-03-07T11:26:41.980 回答