我的代码仅供测试。 我尝试检查stringstream是否会在无法进行类型转换时抛出异常。
以下是我的代码。您可以在您的环境中进行检查。
#include <string>
#include <iostream>
#include <sstream>
using namespace std;
int main() {
stringstream stream("432.23");
char c = 0;
try {
if(!stream>>c) {
cout<<"Error happend"<<endl;
return 0;
}
}
catch(...) {
cout<<"Exception happend"<<endl;
}
cout<<"c="<<c<<endl;
return 0;
}
输出是 C = ^ @
不应该发现错误吗?
答案 0 :(得分:3)
操作!优先级高于运算符&gt;&gt;,因此您必须将代码更改为if(!(stream>>c))
。之后你得到c = 4
答案 1 :(得分:2)
您的问题与运营商优先级
有关该行
if(!stream>>c) {
等于
if(0 >> c)
要获得预期的行为,您需要使用括号:
if(!(stream>>c)) {
然后你将首先尝试移动而不是检查流的状态。
答案 2 :(得分:1)
代码有两个问题:
在读入c之后, if (!stream>>c
将不会测试流failbit
将自动转移failbit c(0)步骤,因为!优先于&gt;&gt;,你
应将其更改为if (!(stream>>c))
。
同样将字符'4'读入c也可以正常工作,所以即使是错误也不会出错 如果你改变了if语句。
如果您希望流引发异常,您可以执行的操作是设置例外 流(但在将c'4'读入c时仍然不会出错。
stream.exceptions(ios_base::failbit | ios_base::badbit);