首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >捕获未知异常

捕获未知异常
EN

Stack Overflow用户
提问于 2011-07-08 21:21:44
回答 5查看 9.8K关注 0票数 6

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

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

下面是一些伪代码

代码语言:javascript
复制
 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");
  }

那么,有没有办法获得抛出的未知异常的详细信息呢?只要一种类型就很好了。

谢谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-07-08 21:29:15

不是真的,它可能是一个int,一个const char*或者一个RhubarbPieü-智能指针。

但是:

  • 也试着捕捉std::exception。这将捕获大量MFC exceptions.
  • Your异常可能是一个.NET异常,所以请尝试捕获该异常,而不是MFC异常。(看起来你是在做C++/CLI。在这种情况下,.NET异常在catch-

-

  • 子句中结束)而且,异常通常是通过C++中的引用来捕获的(更新: MFC显然使用了通过指针抛出并捕获。
  • 使用__try和__catch可能也有帮助,因为一些“硬件”异常,如堆栈溢出、访问冲突等,在Windows上也是未知的异常。捕获它们的语法略有不同,但您可以获得一个异常标识符,该标识符可用于报告抛出的异常的类型。我用它来打印应用程序中致命错误的堆栈跟踪。
票数 6
EN

Stack Overflow用户

发布于 2011-07-08 21:30:32

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

我建议您参考微软文档herehere

票数 1
EN

Stack Overflow用户

发布于 2011-07-08 21:33:17

每个异常都应该从std::exception派生出来,然后你就可以使用RTTI了。标准catch块是

代码语言:javascript
复制
catch (const std :: exception & e) {
    // e .what ();
    // typeid (e);
}
catch (...) {
    // WTF ?!?!?
}

在c++0x中,您可以使用std::current_exception,也许还可以将exception_ptr传递到某个聪明的库中进行分析。

请记住,异常可以是内置的,也可以是没有RTTI的其他类型,这就是为什么你应该总是从std::exception派生的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6625046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档