参考http://www.cnblogs.com/couhujia/archive/2012/10/23/2735682.html
std::invalid_argument ,一个异常类的子类,用于异常检查
值得注意的是其中出现了
1.
~InvalidPeople() throw() {}
的用法
参考http://www.cnblogs.com/mumuliang/archive/2012/03/22/2411521.html
这种写法规定了抛出的类型
throw()就是什么都不可以抛出,throw(std::string, int) 那么只能抛出 std::string 和 int . 同理......
2.
#define TTOSTRING(x) #x
#define TOSTRING(x) TTOSTRING(x)
ErrorInfo ei(__FILE__,TOSTRING(__LINE__),__PRETTY_FUNCTION__);
__FILE__ 包含当前程序文件名的字符串 __LINE__ 表示当前行号的整数 __DATE__ 包含当前日期的字符串 __STDC__ 如果编译器遵循ANSI C标准,它就是个非零值 __TIME__ 包含当前时间的字符串 他那个例子用gcc编译的,如果用ms系列编译器应该把__PRETTY_FUNCTION__换成__FUNCTION__. 由于__LINE__ 为int类型而我们要换成std::string 于是用到 #define TOSTRING(x) #x 定义宏里用到# 就会转换成字符串 #x --> "x" 通常情况下#define TOSTRING(x) #x 就可以了 , 但如果出现嵌套宏如__LINE__ __LINE__ 本身就是宏() 那么(这应该和编译原理有关,我还没学这么课。。先放着)就会展开宏定义里的宏在#define TOSTRING(x) #x下, 就会 "__LINE__" 我们再加一层 #define TTOSTRING(x) #x #define TOSTRING(x) TTOSTRING(x)
猜想:__LINE__宏的替换一定要在 #x前面,所以我们多加了一层。。。。