首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >throw关键字的使用

throw关键字的使用
EN

Stack Overflow用户
提问于 2012-08-09 19:54:15
回答 6查看 342关注 0票数 3

我最近开始用C++编写代码,我对以下代码有疑问。我在“抛出”这个关键字上遇到了麻烦。在median或grade函数中,何时会出现错误?throw和domain_error的确切用法是什么?我会从grade或median函数得到错误消息吗?

代码语言:javascript
复制
#include<iostream>
#include<string>
#include<vector>
#include<iomanip>
#include<ios>
#include<algorithm>
#include<stdexcept>

using std::cout; using std::cin;
using std::vector; using std::endl;
using std::string; using std::streamsize;
using std::setprecision; using std::domain_error;
using std::istream;

double grade(double midterm, double final, double homework)
{
   return 0.2*midterm+0.4*final+0.4*homework;
}

double median(vector<double> vec)
{
   typedef vector<double>::size_type vec_sz;
   vec_sz size= vec.size();
   if(size==0)
   {
       throw domain_error("Median of an empty vector"); //when will i get this error msg??
   }
   sort(vec.begin(),vec.end());
   vec_sz mid=size/2;

   return size%2==0?(vec[mid]+vec[mid-1])/2:vec[mid];
}

double grade(double midterm, double final, const vector<double>& hw)
{
   if(hw.size()==0)
   {
       throw domain_error("Student has done no homework");// when will i get this error?
   }
   return grade(midterm, final, median(hw));
}

istream& read_hw(istream& in, vector<double>& hw)
{
     if(in)
     {
         hw.clear();

         double x;
         while(in>>x)
         hw.push_back(x);

         in.clear();
     }
     return in;
}

int main()
{
    string name;
    cout<<"Please enter your name:";
    cin>>name;
    cout<<"Hello "<<name<<"!"<<endl;
    cout << "Please enter your midterm and final exam grades: ";
    double midterm, final;
    cin >> midterm >> final;
    cout << "Enter all your homework grades, "
                   "followed by end-of-file: ";
    vector<double> homework;
    read_hw(cin, homework);
    try {
        double final_grade = grade(midterm, final, homework);
        streamsize prec = cout.precision();
        cout << "Your final grade is " << setprecision(3)
        << final_grade << setprecision(prec) << endl;
    } catch (domain_error) {
        cout << endl << "You must enter your grades. "
        "Please try again." << endl;
        return 1;
    }

    return 0;

}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-08-09 20:04:05

假设有一系列函数相互调用:

代码语言:javascript
复制
A -> B -> C -> D -> E -> F -> G

如果G抛出类型为X的异常,并且D是最接近捕获类型为X、其父函数之一或...的异常的函数,则函数GFE将被关闭,D将捕获该异常。

在您的示例中,这两个异常都将被main捕获

代码语言:javascript
复制
} catch (domain_error) {

然而,在这个捕获器的主体中,您并没有做太多有用的事情:

代码语言:javascript
复制
cout << endl << "You must enter your grades. "
    "Please try again." << endl;
return 1;

首先,您没有打印domain_error抛出的实际消息。请看Bo Persson对此的回答。

其次,如果你想再试一次,你应该把整个main放在一个循环中,用continue代替return

最后,不要把异常看作是一种出色的错误处理方式,they are not so great

票数 1
EN

Stack Overflow用户

发布于 2012-08-09 19:59:30

您可以从catch语句中的异常中获取消息。

代码语言:javascript
复制
try { 
    double final_grade = grade(midterm, final, homework); 
    streamsize prec = cout.precision(); 
    cout << "Your final grade is " << setprecision(3) << final_grade 
         << setprecision(prec) << endl; 
} catch (const domain_error& error) {

    cout << error.what();  // <-- Will print your message.

} 
票数 4
EN

Stack Overflow用户

发布于 2012-08-09 20:03:00

函数double median(vector<double> vec)将抛出一个domain_error,如果传递的vec不包含elements.The,double grade(double midterm, double final, const vector<double>& hw)将出于同样的原因抛出它-如果hw向量为空。

一旦throw domain_error("...")被执行,mediangrade将停止其执行,并且控制将被立即传递到最接近的对应的catch块,即main中的catch (domain_error)。可以使用domain_error对象的函数what来检索消息。

代码语言:javascript
复制
} catch (const domain_error& ex) {
        cout << ex.what() << endl;
        return 1;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11882863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档