0

我了解到,当我指定函数可以抛出的异常类型时,不能抛出其他异常,但是当我测试这段代码时,它没有遵循这条规则。

void foo(int i)throw(int)
{
    if(i==2)
    {
        throw("exception");
    }
}
int main()
{
    int i=2;
    try
    {
        foo(i);
    }
    catch(const char* ex)
    {
        cout<<ex<<endl;
    }
    return 0;
}

我误解了什么吗?

4

1 回答 1

2

异常规范不像你想象的那样工作。

您仍然可以抛出任何异常,但如果您实际上允许任何未列出的内容逃脱,您将获得对unexpected()and的调用terminate()

认为异常规范类似于 java 规范是常见的错误,但事实并非如此。大多数指南声明不使用它们,可能超出 throw()。某些编译器被指定为不实现它们(如果您使用该编译器,请检查 MSVC dox)。它们在当前标准 (C++11) 中已弃用。__noexcept(true/false) 推进了合理的用例。

于 2013-06-19T16:09:44.610 回答