1

我的代码只是为了测试。当类型转换不可能时,我尝试检查 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=^@

它不应该找到错误吗?

4

3 回答 3

3

操作员!具有比 operator>> 更高的优先级,因此您必须将代码更改为if(!(stream>>c)). 之后你得到 c = 4

于 2012-07-21T13:41:24.383 回答
2

您的问题与运算符优先级有关

线

if(!stream>>c) {

相当于

if(0 >> c) 

要获得预期的行为,您需要使用括号:

if(!(stream>>c)) { 

然后,您将首先尝试转换,然后检查流的状态。

于 2012-07-21T13:44:41.137 回答
1

那么代码有两个问题:

if (!stream>>c读入 c 后不会测试流故障位,它会右移故障位 c (0) 步骤,因为!优先于 >>,您应该将其更改为if (!(stream>>c)).

将 char '4' 读入 c 也可以正常工作,因此即使更改 if 语句也不会出错。

如果您希望流引发异常,您可以做的是在流上设置异常(但在将 char '4' 读入 c 时仍然不会出错)。

stream.exceptions(ios_base::failbit | ios_base::badbit);
于 2012-07-21T13:49:23.230 回答