也是这几天看c++教程了解的~要多努力了!!
例题:给三角形的三边求面积
当输入1,2,1时输出0,明显错误,现在应该如何在错误的时候跳出程序呢?那就得利用try...catch语句来检测有无异常信息。
1、一个try..catch结构中只能有一个try块,但是可以有多个catch块;
2、catch后面的圆括号中,一般只写异常信息的类型名,当然还可以指定变量名:catch(double a);
3、当catch块中没有指定异常信息的类型,而用了删节号"...",则表示它可以捕捉任何类型的异常信息:catch(...);
4、在函数声明中可以进行异常情况指定,在函数声明后补上:throw(),括号中可以不写表示一个不能抛出异常的函数,也可以写上int,例如:throw(int)表示只能抛出int类型的异常信息,也可以写多个....
捕获异常的工作原理是:异常被引发后将检查调用栈,调用栈是在程序的一个部分调用到另一个函数是创建的函数调用列表。
当try块后面有一个或者多个catch语句时,如果异常与某个catch语句匹配,将执行该catch语句并认为异常已得到处理,如果没有匹配的catch语句,将继续解退堆栈,如果异常直到程序开始的位置还没有捕获,将调用内置的处理程序来终止程序。
下面为一个调用类来使用多条catch语句的例子。
#include<iostream>
#include<cstring>
using namespace std;
const int MAX=10;
#define CLR(arr,val) memset(arr,val,sizeof(arr))
class Array{
public:
Array(int Size=MAX);
~Array(){delete[] Arr;}
Array& operator=(const Array&);
int& operator[](int );
int Getsize(){return Size;}
friend ostream& operator<<(ostream &cout,Array &A)
{ for(int i=0;i<A.Getsize();i++)
cout<<A[i]<<" ";
return cout;
}
class xBoundary{};
class xToolBig{};
class xToolSmall{};
class xZero{};
class xNegetive{};
private:
int Arr[MAX];
int Size;
};
inline int& Array::operator[](int pos)
{ int size=Getsize();
if(pos>=0&&pos<Getsize()) return Arr[pos];
throw xBoundary();
return Arr[0];
}
Array::Array(int size):Size(size)
{ if(size==0) throw xZero();
if(size<0) throw xNegetive();
if(size<10) throw xToolSmall();
if(size>200) throw xToolBig();
CLR(Arr,0);
}
int main()
{ try{
Array A(-2);//数组定义大小出现异常.
for(int i=0;i<100;i++)
{ A[i]=i;
cout<<A[i]<<" ";
}
cout<<endl;
}
catch(Array::xBoundary)
{ cout<<"Unable to process you input!!!"<<endl;
}
catch(Array::xToolBig)
{ cout<<"This array is too Big!!!"<<endl;
}
catch(Array::xToolSmall)
{ cout<<"This is is too Small!!!"<<endl;
}
catch(Array::xZero)
{ cout<<"You asked for an array of Zero object!!!"<<endl;
}
catch(...)
{ cout<<"Something went wrong!!!"<<endl;
}
return 0;
}