我最近开始用C++编写代码,我对以下代码有疑问。我在“抛出”这个关键字上遇到了麻烦。在median或grade函数中,何时会出现错误?throw和domain_error的确切用法是什么?我会从grade或median函数得到错误消息吗?
#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;
}发布于 2012-08-09 20:04:05
假设有一系列函数相互调用:
A -> B -> C -> D -> E -> F -> G如果G抛出类型为X的异常,并且D是最接近捕获类型为X、其父函数之一或...的异常的函数,则函数G、F和E将被关闭,D将捕获该异常。
在您的示例中,这两个异常都将被main捕获
} catch (domain_error) {然而,在这个捕获器的主体中,您并没有做太多有用的事情:
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。
发布于 2012-08-09 19:59:30
您可以从catch语句中的异常中获取消息。
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.
} 发布于 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("...")被执行,median或grade将停止其执行,并且控制将被立即传递到最接近的对应的catch块,即main中的catch (domain_error)。可以使用domain_error对象的函数what来检索消息。
} catch (const domain_error& ex) {
cout << ex.what() << endl;
return 1;
}https://stackoverflow.com/questions/11882863
复制相似问题