异常处理
1. 使用try,catch处理异常
#include<iostream>
using namespace std;
int main(){
double m,n;
try{
if(n==0)
throw -1; //抛出异常,如果抛出异常,则停止try的运行,进入catch
else
cout<<m/n<<endl;
cout<<1;
} // 如果不抛出异常,则运行完try,运行catch后的语句
catch(double& d){ //只会根据抛出的异常类型选择一个catch,如果都不符合,程序崩溃
}
catch(int &e){
}
catch(...){ //这能catch任何类型的异常,异常匹配从上到下依次匹配
//所以这一般写在最后的地方
}
cout<<'1'; //这catch后的语句,无论是否抛出异常,都会执行
return 0;
}
2. 异常的在抛出
如果一个函数在执行过程中,抛出的异常在本函数内就被catch块捕获处理了,那么该异常就不会抛给这个函数的调用者(也称上一层函数);如果异常在本函数中没被处理,就会被抛给上一层函数
#include <iostream>
#include<string>
using namespace std;
class CException{
public:
string msg;
CException(string s):msg(s){}
};
double Devide(double x,double y){ //函数内不处理异常
if(y==0)
throw CException("d") ;
return x/y; //如果抛出异常,如果函数没有catch则函数内下面语句全都不执行
}
int Count(int a){
try{
if(a<0)
throw -1;
}
catch(int c){ //做出处理
}
return a*0.15;
}
int main(){
double f=1.2,t;
try{
t=Count(-1); //因为这个的异常,在函数中处理过了,所以在这不退出try
f=Devide(3,0); //有异常,停止try,Devide函数没进行完就退出了,f没有进行赋值
cout<<"1";
}
catch(CException e){
cout<<"2";
}
cout<<"t的值为"<<t; //这里的t有值
return 0;
cout<<f; //这里f的值为1.2
}
2. 在c++标准异常类
c++标准库中有一些类代表异常,这些类都是从exception类派生而来,常用的几个异常类有
exception
- bad_typeid 与类型判断有关
- bad_cast 与类型转换有关
- bad_alloc new运算符分配不成功出现的异常
- ios_base::failure 输入输出产生错误
- logic_error out_of_range 数组下标越界从 logic_error派生出来,用at访问
在使用这些时,写在try里就好,不用写throw,用catch
#include<iostream>
#include<stdexcept>
using namespace std;
int main(){
try{
char *p=new char[1000000]; //如果申请的太大,产生异常
cout<<1; //如果产生异常,终止try
}
catch(bad_alloc&e){
cout<<e.what()<<endl;
}
return 0;
}