2
#include "iostream"
#include "conio.h"
#include "exception"
#include "cstdlib"
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"; }
   getch();
   return 0;
}

输出(在 Visual Studio 2008 上执行时):捕获其他异常(不兼容的编译器?)

但是,我期望输出是:

意外调用

捕捉到 int

注意:我在 Visual Studio 2008 上执行了这个程序。

4

1 回答 1

2

是的,根据标准,输出应该是[#1]

出乎意料的调用
被捕获的int

gcc 给出了准确的结果

请注意,MSVC 在处理异常规范方面是出了名的错误。异常规范被认为是失败的实验
AFAIK,MSVC 不实现异常规范,除了空的(throw()/ nothrow

C++03 标准:

[#1] 15.5.2unexpected()函数[except.unexpected]

unexpected()函数不应返回,但它可以抛出(或重新抛出)异常。如果它抛出先前违反的异常规范允许的新异常,则搜索另一个处理程序将在调用其异常规范被违反的函数时继续......

于 2012-04-07T18:07:03.373 回答