注意:
1.析构函数应该从不抛出异常
因为抛出异常的时候,会进行栈展开,栈展开期间会经常执行析构函数,如果再抛出异常,会导致调用标准库terminate函数。一般而言,terminate函数将调用abort函数,强制从整个程序非正常退出。标准库类型都保证它们的析构函数不会引发异常。
2.构造函数抛出异常时,要保证适当地撤销已构造的成员。
3.如果找不到匹配的catch,程序将调用库函数terminate终止程序。
异常处理代码
#include <iostream>
#include <stdexcept>
#include <math.h>
using namespace std;
double divide(double dividend,double divisor){
if(fabs(divisor)<1e-6){
throw runtime_error("Error : divisor is equal to zero!");
}
return dividend/divisor;
}
int main(int argc, char const *argv[]){
double a,b;
while(cin>>a>>b){
try{
cout<<"result is "<<divide(a,b)<<endl;
}catch(const runtime_error &e){
cerr<<e.what()<<endl;
}
}
return 0;
}
简单测试