2012-07-21 22 views
1

我的代码只是为了测试。 我尝试检查当类型转换不可能时,stringstream是否会抛出异常。stringstream从double到char,没有失败,没有例外

以下是我的代码。你可以在你的环境中检查它。

#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

运营商!比运营商>>有更高的优先级,所以您必须将您的代码更改为if(!(stream>>c))。之后,你都会得到C = 4

2

你的问题与运算符优先级

线

if(!stream>>c) { 

相当于

if(0 >> c) 

得到你需要使用预期的行为做括号:

if(!(stream>>c)) { 

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

1

那么有两个问题代码:

if (!stream>>c不会读成C之后测试流failbit,它 将右移的failbit C(0)的步骤,因为!优先于>>,你 应改为if (!(stream>>c))

同时将char'4'读入c将会正常工作,所以如果更改if语句,即使是 也不会出错。

如果你想要一个流来抛出异常,你可以做什么就是在 流上设置异常(但是当读入char'4'到c中时它仍然不会给出错误)。

stream.exceptions(ios_base::failbit | ios_base::badbit);