Open zixie1991 opened 7 years ago
C++ 闭包(closure)
C++对象模型之RTTI的实现原理
异常规格(exception specification)列出函数可能会抛出的所有异常的类型。异常规格写在函数的形参表之后的关键字throw之后跟着一对圆括号括住的异常类型列表。如:
void foo(int) throw(bad_alloc, invalid_argument) { /*函数体*/ }
异常列表还可以为空:
void foo(int) throw();
表示该函数不抛出任何异常。
如果函数内抛出的异常的类型不在该函数的异常规格中,则系统函数unexpected()被调用。如果在unexpected()中抛出的异常出现在该函数的异常规格中,则在该函数被调用处恢复对异常的catch处理。如果在unexpected()中抛出的异常不在该函数的异常规格中,则调用系统函数terminate()以终止程序。
标准异常类中的构造函数、析构函数和what()虚函数都承诺不抛出异常。如what的完整声明为:virtual const char* what() const throw();
派生类中的虚函数不能抛出基类虚函数中没有声明的新异常。
使用函数的异常规格的好处:
抛出一个对象而不是用函数返回值判断是否出错; 函数调用序列中间的函数可以不考虑异常处理,由某一层函数调用扑捉异常; unwinding自动发生。 Microsoft Visual C++接受但暂不支持C++标准中的函数的异常规格。即使使用了编译器选项/D1ESrt,函数抛出不在其异常规格中的其他类型异常时,不会自动调用unexpected(),而是在该函数调用点处的try...catch...处理。在Visual C++的函数名字修饰(name mangling)中,函数的形参的类型都编码入被修饰后的函数名字中;但是函数的异常说明中的类型都没有编码入被修饰后的函数名字中。
C++基本概念
面向对象
闭包
C++ 闭包(closure)
RTTI(运行时类型识别)
C++对象模型之RTTI的实现原理
异常
函数的异常规格
异常规格(exception specification)列出函数可能会抛出的所有异常的类型。异常规格写在函数的形参表之后的关键字throw之后跟着一对圆括号括住的异常类型列表。如:
异常列表还可以为空:
表示该函数不抛出任何异常。
如果函数内抛出的异常的类型不在该函数的异常规格中,则系统函数unexpected()被调用。如果在unexpected()中抛出的异常出现在该函数的异常规格中,则在该函数被调用处恢复对异常的catch处理。如果在unexpected()中抛出的异常不在该函数的异常规格中,则调用系统函数terminate()以终止程序。
标准异常类中的构造函数、析构函数和what()虚函数都承诺不抛出异常。如what的完整声明为:virtual const char* what() const throw();
派生类中的虚函数不能抛出基类虚函数中没有声明的新异常。
使用函数的异常规格的好处:
抛出一个对象而不是用函数返回值判断是否出错; 函数调用序列中间的函数可以不考虑异常处理,由某一层函数调用扑捉异常; unwinding自动发生。 Microsoft Visual C++接受但暂不支持C++标准中的函数的异常规格。即使使用了编译器选项/D1ESrt,函数抛出不在其异常规格中的其他类型异常时,不会自动调用unexpected(),而是在该函数调用点处的try...catch...处理。在Visual C++的函数名字修饰(name mangling)中,函数的形参的类型都编码入被修饰后的函数名字中;但是函数的异常说明中的类型都没有编码入被修饰后的函数名字中。