c++ std::invalid_argument应用
想研究std::invalid_argument的朋友可以参考下
首先说明invalid_argument是一个类(class invalid_argument;),它的继承关系如下
exception-------->logic_error--------->invalid_argument
invalid_argument原型是
class invalid_argument:public logic_error {
public:
explicit invalid_argument (const string& what_arg);
};
它在stdexcept头文件中,在std命名空间内。下面举一个例子来使用它
#include <iostream>
#include <stdexcept>
int main(int argc,char ** argv)
{
try
{
bool errorArgument;
errorArgument=true;
if(errorArgument)
{
throw std::invalid_argument("occur error!");
}
}
catch(std::invalid_argument &ia)
{
//what()为invalid_argument继承exception类的函数
std::cerr<<" Invalid_argument "<< ia.what()<<std::endl;
}
return 0;
}
运行结果为:
Invalid_argument occur error!那么上面的例子是一个最简单的应用了。invalid_argument顾名思义指无效参数,这个应该应用在检查参数是否是无效的,一般检查参数用于特定的函数以及类,那么就应该是给类的成员变量赋值或者函数参数赋值时,检查其赋给它们的值是否有效,例如有一个类(people,有三个成员变量name,age,height)那么我们知道人的年龄在0~150岁之间(ps:如果对于程序员可以直接定义为0~75)。身高的话0~300cm,名字的长度不会超过20。如果都超过这些范围,就可以认定是无效数据。那么这个类可以如下定义:
#include <stdexcept>
#include <iostream>
#include <string>
class People
{
public:
People(const std::string& n,const int& a,const int& h)
:name(n),age(a),height(h)
{}
inline void set(const std::string& n,const int& a,const int& h)
{
if(!valid(n,a,h))
{
throw std::invalid_argument("People's argument is error");
}
name = n;
age = a;
height = h;
}
inline bool valid(const std::string& n, const int& a, const int& h)
{
return ( n.length() == 0 ||n.length() > 20 )&& a >= 0 && a< 150 && h > 0 && h < 300 ;
}
private:
std::string name;
int age;
int height;
};
int main(int argc, char** argv)
{
People p("Li San", 20 , 170);
try
{
p.set("Li San" , 20 ,1700);
}
catch (std::invalid_argument & ia)
{
std::cerr << "Error: " << ia.what() << std::endl;
}
return 0;
}
其运行结果为:
Error: People's argument is error上面程序只要输入无效数据,就会输出错误。但是仅仅这样是不够的,我们还无法定位无效参数在哪个文件与哪个一行或者在哪个函数中,如果在打印错误的时候连这些信息一并输出相信定位问题就方便多了。那么我们在报出错误信息的时候连这些信息也附加上就明确多了。
#include <stdexcept>
#include <iostream>
#include <string>
#define TOSTRING(x) #x
//class ErrorInfo
//{
// public:
// ErrorInfo(const std::string& f,const std::string& l,const std::string& fun)
// : file(f), line(l), func(fun)
// {}
//
// inline const std::string getFile() const
// {
// return this->file;
// }
//
// inline const std::string getLine() const
// {
// return this->line;
// }
//
// inline const std::string getFunc() const
// {
// return this->func;
// }
//
// private:
// const std::string file;
// const std::string line;
// const std::string func;
/
exception-------->logic_error--------->invalid_argument
invalid_argument原型是
代码如下:
class invalid_argument:public logic_error {
public:
explicit invalid_argument (const string& what_arg);
};
它在stdexcept头文件中,在std命名空间内。下面举一个例子来使用它
代码如下:
#include <iostream>
#include <stdexcept>
int main(int argc,char ** argv)
{
try
{
bool errorArgument;
errorArgument=true;
if(errorArgument)
{
throw std::invalid_argument("occur error!");
}
}
catch(std::invalid_argument &ia)
{
//what()为invalid_argument继承exception类的函数
std::cerr<<" Invalid_argument "<< ia.what()<<std::endl;
}
return 0;
}
运行结果为:
Invalid_argument occur error!那么上面的例子是一个最简单的应用了。invalid_argument顾名思义指无效参数,这个应该应用在检查参数是否是无效的,一般检查参数用于特定的函数以及类,那么就应该是给类的成员变量赋值或者函数参数赋值时,检查其赋给它们的值是否有效,例如有一个类(people,有三个成员变量name,age,height)那么我们知道人的年龄在0~150岁之间(ps:如果对于程序员可以直接定义为0~75)。身高的话0~300cm,名字的长度不会超过20。如果都超过这些范围,就可以认定是无效数据。那么这个类可以如下定义:
代码如下:
#include <stdexcept>
#include <iostream>
#include <string>
class People
{
public:
People(const std::string& n,const int& a,const int& h)
:name(n),age(a),height(h)
{}
inline void set(const std::string& n,const int& a,const int& h)
{
if(!valid(n,a,h))
{
throw std::invalid_argument("People's argument is error");
}
name = n;
age = a;
height = h;
}
inline bool valid(const std::string& n, const int& a, const int& h)
{
return ( n.length() == 0 ||n.length() > 20 )&& a >= 0 && a< 150 && h > 0 && h < 300 ;
}
private:
std::string name;
int age;
int height;
};
int main(int argc, char** argv)
{
People p("Li San", 20 , 170);
try
{
p.set("Li San" , 20 ,1700);
}
catch (std::invalid_argument & ia)
{
std::cerr << "Error: " << ia.what() << std::endl;
}
return 0;
}
其运行结果为:
Error: People's argument is error上面程序只要输入无效数据,就会输出错误。但是仅仅这样是不够的,我们还无法定位无效参数在哪个文件与哪个一行或者在哪个函数中,如果在打印错误的时候连这些信息一并输出相信定位问题就方便多了。那么我们在报出错误信息的时候连这些信息也附加上就明确多了。
代码如下:
#include <stdexcept>
#include <iostream>
#include <string>
#define TOSTRING(x) #x
//class ErrorInfo
//{
// public:
// ErrorInfo(const std::string& f,const std::string& l,const std::string& fun)
// : file(f), line(l), func(fun)
// {}
//
// inline const std::string getFile() const
// {
// return this->file;
// }
//
// inline const std::string getLine() const
// {
// return this->line;
// }
//
// inline const std::string getFunc() const
// {
// return this->func;
// }
//
// private:
// const std::string file;
// const std::string line;
// const std::string func;
/
精彩图集
精彩文章