C++中的异常处理:使用 "throw(int)" 时抛出双精度

exception handling in C++: Throwing a double when using "throw(int)"

本文关键字:int 双精度 throw 异常处理 使用 C++      更新时间:2023-10-16

下面的程序总是输出"Error:double 10.2"

我不明白为什么。据我所知,如果fun1()只允许抛出int,程序也应该这样做(1)事故(2)或者将double类型改为int类型,然后抛出。这意味着,输出应该是"Error:int 10"。然而,事实并非如此。有人能解释一下吗?

void fun1() throw (int)
{
    cout<<"3";
    throw 10.2;
    cout<<"4";
}
int main()
{
    try {   fun1(); }
    catch(int i) { cout<<"Error:int" <<i <<endl;}
    catch(double i) { cout << "Error:double" << i << endl; }
    cout << endl;
    return 0;
}

您的编译器不符合标准。根据标准,程序应该在让double异常转义fun1后以调用std::unexpected结束。
也就是说,不要使用异常规范。

MSVC将throw(int)视为简单的"可以抛出任何东西",即等同于throw(...),参见异常规范(MSDN)

这不符合c++ 03标准,但实际上比c++ 03的行为更有用,更接近c++ 11标准的精神。

在c++ 11中,throw(X)已被弃用,新的异常规范形式是noexcept,可以是noexcept(true)noexcept(false),相当于throw()throw(...),这是MSVC支持的全部。

如果你想使用旧式的异常规范,只需使用throw()表示"不会抛出",或者不使用throw(...)表示"可能抛出",而不要使用throw(X)。这将在c++ 03和c++ 11以及所有编译器中一致工作。