C++中的异常处理:使用 "throw(int)" 时抛出双精度
exception handling in C++: Throwing a double when using "throw(int)"
下面的程序总是输出"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以及所有编译器中一致工作。
相关文章:
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- f 是指向函数的指针,该函数采用 int,并返回指向不带任何内容并返回双精度的函数的指针
- 将双精度值分配给 int 数组时的类型转换
- 标准::p空气<矢量、双精度的初始值设定项列表<int>>
- 如果我在 C++ 中为 int 提供双精度,输入缓冲区中存储了什么?
- 是否应该避免这种从 int 到双精度的静态转换?
- 在 C++ 中将 int 转换为双精度
- 将大双精度转换为无符号 int 期间堆栈损坏
- 将 int 转换为双精度以执行 std::complex <double>的"*"操作
- C++ 将 int 转换为双精度不起作用
- 在算术表达式中,双精度会隐式转换为无符号 int 吗?
- 将 Int 指针分配给双精度变量
- 警告从"双精度"转换为"int"
- 如何使用priority_queue<对<双精度,int> >
- 为什么当我将 int 乘以双精度时会得到错误的值
- C++ 忽略类型检入函数(需要双精度,提供 int)
- 在模板运算符*中将 int 隐式转换为双精度<>
- 将双精度转换为 int 的结果是错误的
- C++ 传递一个 int,错误地说这是一个双精度
- int 未转换为双精度