在 C++ 中转换为双精度时处理异常

handling exception while converting to double in c++

本文关键字:处理 异常 双精度 C++ 转换      更新时间:2023-10-16

>我正在从文本文件中读取数据,我需要从文件中读取双精度值。现在的问题是,如果双精度值无效,例如"!@#$%^&*",那么我希望我的程序给出异常,以便我可以处理它。这是我的代码

void Employee::read(istream &is) {
    try{
        is.get(name, 30);
        is >> salary;
        char c;
        while(is.peek()=='n')
            is.get( c ); 
    }
    catch(exception e){
    }
}

下面是验证输入的可运行示例。

#include<iostream>
#include<sstream>
#include<limits>
using std::numeric_limits;
int main(){
    std::string goodString = "12.212", badString = "!@$&*@"; 
    std::istringstream good(goodString), bad(badString);
    double d1=numeric_limits<double>::min(),
           d2=numeric_limits<double>::min();
    std::string tmp;
    
    good >> d1;
    if (d1 == numeric_limits<double>::min()) {
      // extraction failed
      d1 = 0;
      good.clear(); // clear error flags to allow further extraction
      good >> tmp; // consume the troublesome token
      std::cout << "Bad on d1n";
    } else std::cout << "All good on d1n";
    
    if (d2 == numeric_limits<double>::min()) {
      d2 = 0;
      bad.clear();
      bad >> tmp;
      std::cout << "Bad on d2n";
    } else std::cout << "All good on d2n";
}

产生的输出是..

在 d1 上都很好

在 d2 上不好

我终于通过为 istream 设置异常位来使其工作

is.exceptions(ios::failbit | ios::badbit);  //setting ifstream to throw exception on bad data