程序的错误大致可以分为三种,分别是语法错误、逻辑错误和运行时错误:
1) 语法错误在编译和链接阶段就能发现,只有 100% 符合语法规则的代码才能生成可执行程序。
2) 逻辑错误是说我们编写的代码思路有问题,不能够达到最终的目标,这种错误可以通过调试来解决。
3) 运行时错误是指程序在运行期间发生的错误,例如除数为 0、内存分配失败、数组越界、文件不存在等。C++ 异常(Exception)机制就是为解决运行时错误而引入的。
运行时错误如果放任不管,系统就会执行默认的操作,终止程序运行,也就是我们常说的程序崩溃(Crash)。C++ 提供了异常(Exception)机制,让我们能够捕获运行时错误,给程序一次“起死回生”的机会,或者至少告诉用户发生了什么再终止程序。(以上引用他人的)
1) 语法错误在编译和链接阶段就能发现,只有 100% 符合语法规则的代码才能生成可执行程序。
2) 逻辑错误是说我们编写的代码思路有问题,不能够达到最终的目标,这种错误可以通过调试来解决。
3) 运行时错误是指程序在运行期间发生的错误,例如除数为 0、内存分配失败、数组越界、文件不存在等。C++ 异常(Exception)机制就是为解决运行时错误而引入的。
运行时错误如果放任不管,系统就会执行默认的操作,终止程序运行,也就是我们常说的程序崩溃(Crash)。C++ 提供了异常(Exception)机制,让我们能够捕获运行时错误,给程序一次“起死回生”的机会,或者至少告诉用户发生了什么再终止程序。(以上引用他人的)
Try{…}
Catch{…}
{}不可省略
throw中抛出异常
执行顺序:
1.首先执行try块内容;若没有异常,执行catch之后的内容。Catch块只在有异常并且类型匹配时才执行;
2.若执行的throw,一个异常对象得到创建;若在try块中,后面的catch执行类型匹配。
3.若在try’块外,或异常与类型不匹配,则回到当前函数调用点,重复寻找匹配类型的过程;
4.若最终没有找到,运行库函数terminate,终止程序;
#include
using namespace std;
template
double devide(T a,T b) throw(string)
{
if(b==0)
{
string c="b is zero";
throw c;
}
return a/b;
}
int main()
{
double b;
try{
b=devide(7.0,0.0);
b=devide(7.0,1.1);
}
catch(int){
}
// catch (string v){
// cout<
<
输出:
类型匹配成功:
#include
using namespace std;
template
double devide(T a,T b) throw(string)
{
if(b==0)
{
string c="b is zero";
throw c;
}
return a/b;
}
int main()
{
double b=0;
try{
b=devide(7.0,0.0);
b=devide(7.0,1.1);
}
catch(int){
}
catch (string v){
cout<
<
输出:
’
注意,
1.异常抛出后,try块内剩余内容不会得到执行,而try,catch体系后其他内容依旧会得到执行
2.异常执行顺序依照catch中其出现顺序,所以顺序很重要;
3.catch(...)应对所有异常
4.函数后还可以加入异常接口声明,指明该函数可以抛出什么异常,如抛出的不相符,执行unexpected函数,该函数默认调用函数terminate,终止程序。
没有声明,表示可以抛出任何异常;
throw()空的表明不会抛出异常;
5,catch内或其子函数,还可将异常继续抛出;写作throw;即可,抛出源对象,非副本;
6.异常抛出前,对所有构造的对象自动调用析构函数(unwinding);
7.异常的引发与处理不必在一个函数中;
异常的匹配条件:
1.catch的异常声明类型是抛出对象类型或引用
2.catch的异常声明类型是抛出对象类型的基类或引用
3.catch的异常声明类型,抛出对象类型,都是指针类型,且后者可以隐式转化为前者,如派生类指针转化为基类指针