C ++异常规范 - 处理无效异常

时间:2012-06-19 08:45:45

标签: c++ visual-studio-2010 gcc exception-handling exception-specification

当函数抛出异常不在有效的异常列表中时,标准行为是什么?例如,当我运行此代码时:

#include <iostream>
#include <cstdlib>

using namespace std;

void NotLegal() throw(char) {
    throw 42;
}

void myunexpected () {
  cout << "exception not in list\n";
  cin.get();
  exit(0);
}

int main()
{
    set_unexpected(myunexpected);

    try {
       NotLegal();
   }
   catch(...) {
       cout << "exception catched";
       cin.get();
   }

   return 0;
}

它在GCC和Visual Studio C ++编译器上的行为有所不同:

  • 在VS 2010上,预期的异常会在常规异常处理程序中被捕获。
  • 在GCC unexpected()上调用处理函数而不是捕获异常。

为什么会有这种差异?为什么MS C ++编译器不调用unexpected()回调?

2 个答案:

答案 0 :(得分:3)

set_unexpected的{​​{3}}会调出此行为:

  

说明

     

...

     

C ++标准要求在函数抛出不在其throw列表中的异常时调用unexpected。目前的实施不支持这一点。

答案 1 :(得分:1)

你用正确的标志编译了吗? Visual Studio默认情况下不会为某些优化版本构建启用异常处理。

您需要/c and /EHsc