出乎意料的事情发生了

时间:2011-02-10 09:20:49

标签: c++ exception

我正在努力处理意外的异常,但无法使其发挥作用。这是来自C++ Reference

的示例
// set_unexpected example
#include <iostream>
#include <exception>
using namespace std;

void myunexpected () {
  cerr << "unexpected called\n";
  throw 0;     // throws int (in exception-specification)
}

void myfunction () throw (int) {
  throw 'x';   // throws char (not in exception-specification)
}

int main (void) {
  set_unexpected (myunexpected);
  try {
    myfunction();
  }
  catch (int) { cerr << "caught int\n"; }
  catch (...) { cerr << "caught other exception (non-compliant compiler?)\n"; }
  return 0;
} 

他们说输出应该是: 输出:

意外调用

抓住了

尝试时不会发生这种情况。我的输出是:
发现了其他异常(不合规的编译器?)
我正在使用VS2010 sp1

3 个答案:

答案 0 :(得分:6)

unexpected的{​​p> Documentation说: C ++标准要求在函数抛出不在其throw列表中的异常时调用意外。目前的实施不支持这一点。
所以答案是VC10是一个不兼容的编译器。

答案 1 :(得分:0)

Visual Studio未正确实现标准。见this MSDN pageint已解析,但未使用。

答案 2 :(得分:0)

当函数具有异常说明符时,Visual C ++始终发出Warning C4290。来自MSDN中的同一篇文章:“使用异常规范声明函数,Visual C ++接受但未实现。”因此,此编译器不符合标准。