当我在使用空throw()说明符指定的函数中抛出异常时,为什么没有调用std :: unexpected()?

时间:2015-03-15 18:42:22

标签: c++ exception visual-studio-2013

我对throw()说明符的理解是,当从给定函数中抛出时,说明符中未列出的任何异常类型都将导致对std :: unexpected()的调用。 所以我希望以下代码的输出是“意外调用”,但我看到“捕获异常”。我正在使用VS2013编译它,它没有实现noexcept这就是我使用throw()的原因。

#include <iostream>       
#include <exception>      

void testFunc() throw () {
    throw std::exception();
}

int main(void) {
    std::set_unexpected([](){
        std::cout << "unexpected called"; 
    });

    try {
        testFunc();
    }
    catch (...) {
        std::cerr << "Caught an exception"; 
    }

    return 0;
}

为什么没有调用std :: unexpected?

1 个答案:

答案 0 :(得分:1)

https://msdn.microsoft.com/en-us/library/vstudio/wfa0edys%28v=vs.120%29.aspx说:

  

Visual C ++在其实现中脱离了ISO C ++标准   例外规范。

     

[...]

     

[...]如果从标记为throw()的函数中抛出异常,则   Visual C ++编译器不会调用unexpected [...]。

     

[...]

     

由于代码   可能由C ++编译器执行的优化(基于   假设函数不抛出任何C ++异常)if   函数会抛出异常,程序可能无法执行   正确。

此外,为了支持上述内容,https://msdn.microsoft.com/en-us/library/vstudio/awbt5tew.aspx说:

  

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