c++ std::invalid_argument 응용
6947 단어 invalid argument
class invalid_argument:public logic_error {
public:
explicit invalid_argument (const string& what_arg);
};
stdxcept 헤더 파일 에서 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 세 사이 라 는 것 을 알 고 있다.키 는 0~300 cm 이 고 이름 길 이 는 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 입 니 다.위의 프로그램 은 잘못된 데 이 터 를 입력 하면 출력 오류 가 발생 합 니 다.그러나 이것 만 으로 는 부족 합 니 다.우 리 는 잘못된 매개 변수 가 어느 파일 과 어느 줄 또는 어느 함수 에 있 는 지 찾 을 수 없습니다.만약 에 인쇄 가 잘못 되 었 을 때 이 정보 들 을 함께 출력 하면 포 지 셔 닝 문 제 를 믿 는 것 이 훨씬 편리 합 니 다.그러면 우 리 는 잘못된 정 보 를 보고 할 때 이런 정보 까지 추가 하면 훨씬 명확 해진 다.4567913)그 운행 결 과 는:TestError:invalida.cpp:__LINE__:void People::set(const std::string&,const int&,const int&)Invalid People 주의:(1)위\#define TOSTRING(x)\#x 는 int 형식 을 const char*형식 으로 변환 할 수 있 습 니 다.(2) __FILE__const char*형식 이 며,\#define TOSTRING(x)을 통 해 변 환 된 형식 은 const char*형식 입 니 다.컴 파 일 러 는 gun 입 니 다.함수 이름 은 입 니 다.PRETTY_FUNCTION__const char*타 입 입 입 니 다.보 입 니 다LINE__줄 번호 가 표시 되 지 않 았 습 니 다.이 이 유 는 컴 파일 러 가LINE__""로 전환LINE__"이 문자열 입 니 다.그럼 여 기 는 어떻게 해결 합 니까?필 자 는 여러 가지 방법 을 시험 해 보 았 는데 결국 찾 아 냈 다.우 리 는\#define 에서 한 번 만 하면 정상 적 인 현실 을 찾 을 수 있다.다음 코드
#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;
//};
class ErrorInfo
{
public:
ErrorInfo(const char * f, const char * l, const char * fun)
:file(f), line(l), func(fun)
{}
inline std::string getFile() const
{
return this->file;
}
inline std::string getLine() const
{
return this->line;
}
inline std::string getFunc() const
{
return this->func;
}
private:
const char* file;
const char* line;
const char* func;
};
std::string operator +(const std::string & str, const ErrorInfo& ei)
{
std::string strTemp(ei.getFile() + ":" + ei.getLine() + ":" + ei.getFunc());
strTemp +=str;
return strTemp;
//return str::string(ei.getFile() + ":" + ei.getLine() + ":" + ei.getFunc() += str );
}
class InvalidPeople:public std::invalid_argument
{
public:
InvalidPeople(ErrorInfo & ei)
: std::invalid_argument( "Invalid People " + ei )
{}
~InvalidPeople() throw()
{}
};
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))
{
ErrorInfo ei(__FILE__,TOSTRING(__LINE__),__PRETTY_FUNCTION__);
// ErrorInfo ei(__FILE__,#__LINE__,__PRETTY_FUNCTION__);
throw InvalidPeople(ei);
// throw InvalidPeople(ErrorInfo(__FILE__,TOSTRING(__LINE__),__PRETTY_FUNCTION__));
}
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;
}
의 실행 결 과 는 TestError:invalid 입 니 다.a.cpp:91:void People::set(const std::string&,const int&,const int&)Invalid People 은 그 안의 원리 에 대해 왜 두 번 이면LINE__예 를 들 어(71)const char*"71"로 전환 하 는 것 이지""로 전환 하 는 것 이 아 닙 니 다.LINE__"const char*문자열,명확 한 원우 에 게 답 을 주 십시오.감사합니다!