异常
abort()函数会发出SIGABRT信号导致进程异常终止。
C++的异常要注意的是throw语句实际上是跳转语句,它会抛出一个对象或者说实例然后跳到catch语句块那里然后找对应的类型进行匹配,一旦匹配上就执行catch块里的内容。通常我们可以构造一个类用作异常类型,这样可以使用不同的异常类型来区分不同函数在不同情况下引发的异常。
C++异常处理采用栈解退机制。
引发异常时编译器总是创建一个临时拷贝,即使异常规范和catch块中指定的是引用。这里使用引用的原因是基类引用可以执行派生类对象。
exception类
在标准库<stdexcept>中异常类及其派生类的结构
对于使用new导致的内存分配问题,C++的最新处理方式是让new引发bad_alloc异常。该异常类的声明在<new>中,它也是从exception类派生而来。
示例程序
#include <iostream>
#include <string>
#include <exception>
using namespace std;
class bad_man : public exception
{
public:
const char* what() const
{
return "bad man!!!";
}
};
int divide(int a, int b) {
if (b == 0) {
throw bad_man();
}
return a / b;
}
int main() {
try {
divide(1, 0);
}
catch (const exception& bad) {
cout << bad.what() << endl;
}
return 0;
}