stringstream从double到char,没有失败,也没有异常

时间:2012-07-21 13:29:36

标签: c++ exception stringstream

我的代码仅供测试。 我尝试检查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 = ^ @

不应该发现错误吗?

3 个答案:

答案 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);