抓住未知的例外

时间:2011-07-08 13:21:44

标签: c++ mfc exception-handling

在我的代码的发布版本中,一行引发异常,我不知道它是什么类型的异常,所以我无法正确捕获它或找出问题。

我使用了catch(...),但这几乎毫无价值。

这里有一些伪代码

 try
  {
    m_mmwIPC = gcnew NiftyIPC(gcnew String("Monitor"), true);
  }
  catch (CException* e)
  {
    TCHAR   szCause[255];
    e->GetErrorMessage(szCause, 255);
    CString errorStr = szCause;
    RemoveLineFeeds(errorStr);
    OutputDebugString(errorStr);
  }
  catch(...)
  {
    OutputDebugString(L"Unknown exception\n");
  }

那么,有没有办法获得有关抛出的未知异常的任何细节?只是一种类型会很棒。

感谢

5 个答案:

答案 0 :(得分:6)

不是,它可能是intconst char*RhubarbPie超智能指针。

然而:

  • 尝试捕捉std::exception。这将捕获许多C ++本机异常。
  • 您的异常可能是.NET异常,因此请尝试捕获该异常,而不是MFC Base异常。 (看起来你正在做C ++ / CLI。在这种情况下,.NET-exceptions最终会出现在catch-all子句中)
  • 此外,异常通常意味着在C ++中通过引用捕获 (更新:MFC显然通过指针使用throw-and-catch。只要你捕获被抛出的内容,它也可以。
  • 使用__try和__catch也可能有所帮助,因为某些“硬件”异常(如堆栈溢出,访问冲突等)在Windows上也是未知的异常。捕获它们的语法略有不同,但是您获得了一个异常标识符,可用于报告抛出的异常类型。我用它在我们的应用程序中打印致命错误的堆栈跟踪。

答案 1 :(得分:1)

当您指定使用MFC时,我将假设您使用的是Visual Studio版本。如果是这种情况并且您能够以调试模式运行程序,则可以将调试器设置为中断未处理的异常。这需要删除代码的catch(...)部分,但它应该在正确的位置进入调试器,并为您提供有关异常本身的有用信息。

我推荐您使用Microsoft文档herehere

答案 2 :(得分:1)

每个异常都应来自std::exception,然后您可以使用RTTI。标准捕获块是

catch (const std :: exception & e) {
    // e .what ();
    // typeid (e);
}
catch (...) {
    // WTF ?!?!?
}

在c ++ 0x中,你可以使用std::current_exception并将exception_ptr传递给一些聪明的库进行分析。

请记住,异常可以是buildins和其他没有RTTI的类型,这就是为什么你应该总是从std :: exception派生出来。

答案 3 :(得分:0)

不,这不是。 catch(...)应该只作为最后的手段使用。

答案 4 :(得分:0)

一个选项是捕获错误并在调试器中运行程序员(这在发布模式下是可能的)。 Visual Studio将进入未捕获异常发生的代码。