1)异常是一种程序控制机制,与函数机制独立和互补
函数是一种以栈结构展开的上下函数衔接的程序控制系统,异常是另一种控制结构,它依附于栈结构,却可以同时设置多个异常类型作为网捕条件,从而以类型匹配在栈机制中跳跃回馈.
2)异常设计目的:
栈机制是一种高度节律性控制机制,面向对象编程却要求对象之间有方向、有目的的控制传动,从一开始,异常就是冲着改变程序控制结构,以适应面向对象程序更有效地工作这个主题,而不是仅为了进行错误处理。
异常设计出来之后,却发现在错误处理方面获得了最大的好处。
用法:
1) 若有异常则通过throw操作创建一个异常对象并抛掷。
2) 将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺序执行到达try语句,然后执行try块内的保护段。
3) 如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行。程序从try块后跟随的最后一个catch子句后面的语句继续执行下去。
4) catch子句按其在try块后出现的顺序被检查。匹配的catch子句将捕获并处理异常(或继续抛掷异常)。
5) 如果匹配的处理器未找到,则运行函数terminate将被自动调用,其缺省功能是调用abort终止程序。
6)处理不了的异常,可以在catch的最后一个分支,使用throw语法,向上扔。
7)异常机制与函数机制互不干涉,但捕捉的方式是基于类型匹配。捕捉相当于函数返回类型的匹配,而不是函数参数的匹配,所以捕捉不用考虑一个抛掷中的多种数据类型匹配问题
8)异常捕捉严格按照类型匹配
异常捕捉的类型匹配之苛刻程度可以和模板的类型匹配媲美,它不允许相容类型的隐式转换,比如,抛掷char类型用int型就捕捉不到
构造函数没有返回类型,无法通过返回值来报告运行状态,所以只通过一种非函数机制的途径,即异常机制,来解决构造函数的出错问题。
#include<iostream>
using namespace std;
//声明Div函数
//int Div(int x ,int y); //可以抛出任何异常
//int Div(int x, int y) throw(); //不可抛出异常
int Div(int x, int y) throw(int ,char); //可以抛出int,char类型的异常
int f(int x, int y)
{
try
{
Div(x,y);
}
catch(int)
{
throw 'a';
}
}
int main()
{
int a,b;
cout << "Please input :" << endl;
cin >> a >> b;
try
{
//cout << Div(a,b) << endl;
cout << f(a,b) << endl;
}
catch(int) //捕捉异常
{
cout << "Int Zero Exception" << endl;
}
catch(char)
{
cout << "Char Zero Exception" << endl;
}
return 0;
}
//若将函数放在下面,则需要声明
int Div(int x, int y) throw(int ,char)
{
if(0 == y)
{
throw 0; //抛出异常 自动找到下面的catch(int)
//throw 'a'; //抛出异常 自动找到下面的catch(char)
}
return x/y;
}
栈解旋
栈解旋
1)为了加强程序的可读性,可以在函数声明中列出可能抛出的所有异常类型,例如:
void func() throw (A, B, C , D); //这个函数func()能够且只能抛出类型A B C D及其子类型的异常。
2)如果在函数声明中没有包含异常接口声明,则次函数可以抛掷任何类型的异常,例如:
void func();
3)一个不抛掷任何类型异常的函数可以声明为:
void func() throw();
4) 如果一个函数抛出了它的异常接口声明所不允许抛出的异常,unexpected函数会被调用,该函数默认行为调用terminate函数中止程序
zzhan
#include <iostream>
using namespace std;
class Test
{
private:
int m_a;
public:
Test();
Test(const Test &T);
~Test();
};
Test::Test()
{
cout << "Test constructor" << endl;
}
Test::~Test()
{
cout << "Test destruct" << endl;
}
int Div(int x, int y)
{
Test t;
if(0 == y)
{
cout << "Div throw" << endl;
throw 0;
}
cout << "Div return " << endl;
return x/y;
}
int main()
{
int a, b;
cin >> a >> b;
try
{
//Test t2;
cout << Div(a,b) << endl;
}
catch(Test t) //调用拷贝构造函数
{
cout << "catch" << endl;
cout << "Zero Exception" << endl;
}
catch(Test &t) //建议用引用函数接抛出的异常
{
cout << "Zero Exception" << endl;
}
catch(Test *t)
{
cout << "Zero Exception" << endl;
}
cout << "main return" << endl;
return 0;