异常处理实例:
#include <iostream>
#include <string>
using namespace std;
class MyException
{
public:
MyException(const string&message):
message(message) {}
~MyException() {}
const string &getMessage() const
{
return message;
}
private:
string message;
};
class Demo
{
public:
Demo()
{
cout<<"Constructor of Demo"<<endl;
}
~Demo()
{
cout<<"Destructor of Demo"<<endl;
}
};
void func()throw (MyException)/*异常接口声明:
可以在函数的声明中列出这个函数可能抛掷的所有异常类型.
若不写异常接口声明,则此函数可以抛掷任何类型的异常。
不抛掷任何类型异常的函数声明如下:
void fun() throw();
*/
{
Demo d;
cout<<"Throw MyExpection in func"<<endl;
throw MyException("exception thrown by func()");///被main中catch接受,赋给e
}
int main()
{
cout<<"In main function"<<endl;
try{func();}
catch(MyException&e)
{
cout<<"Caught an exception: "<<e.getMessage()<<endl;
}
cout<<"Resume the execution of main()"<<endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
void f2();
void f3();
void f1()
{
try{f2();}
catch(char)
{
cout<<"OK1!";
}
cout<<"END1"<<endl;
}
void f2()
{
try{f3();}
catch(int)
{
cout<<"OK2!"<<endl;
}
cout<<"END2"<<endl;
}
void f3()
{
double a=0;
try {throw a;}
catch(float)
{
cout<<"OK3!"<<endl;
}
cout<<"END3"<<endl;
}
int main()
{
try {f1();}
catch(double)
{
cout<<"OK0!"<<endl;
}
cout<<"END0"<<endl;
return 0;
}
1)在main函数的try块中调用f1函数,在f1函数的try块中调用f2函数,在f2函数的try块中义调用f3函数。
2)在执行f3函数过程中执行了throw语句,抛出double型异常信息a。由于在f3中没找到和a类型相匹配的catch子句,于是将a抛给f3的调用者f2函数,在f2没有找到和a类型相匹配的catch子句,又将a抛给f2的凋用者f1函数,在f1中没找到和a类刷相匹配的catch子句,又将a抛给f1的调用者main函数。
3)而main函数中的try—catch结构中找到和a类型相匹配的catch子句,main中的catch子句就是离throw最近的且与之匹配的catch广句,执行该子句的复合语句,输出”OK0!”,再执行该catch 后的 cout语句。
1、异常处理的语法格式:
1) throw 表达式;
2)try----catch的结构:
try
{被检查的语句}
catch(异常信息类型)
{进行异常处理的语句}
说明:
(1)被检测的函数调用必须放在try块中,否则不起作用。
(2)try块和catch块作为一个整体出现,catch块是try--catch结构中的一部分,必须紧跟跟在
try块之后,不能单独使用,在二者之间不能插入其它语句,
(3)try和catch块必须用花括号括起来的复合语句,即使花括号内只有一个语句也不能省略{ }。
(4)一个try—catch结构中只能有一个try块,但却可以有多个catch块,以便与不同的异常信息匹配;
例如:try { }
catch (double)
catch (int)
catch (char)
……….
(5)catch后面的圆括号中只写异常信息的类型名,catch只检查所捕获异常信息的类型,而不检查它们
的值,例如a,b,c都是double 类型,虽然它们的值不同,但在throw语句中写成throw a、throw b或
throw c,作用均相同。
注意:异常信息可以是C++预定义的标准类型,也可以是用户自定义的类型(类或结构体)。
(6)如果在catch子句中没指定异常信息类型,而是用“…”,例如 :
Catch(…){cout<<“ok”<<endl;}
表示可以捕捉任何类型的异常信息。
注意:这种catch子句应放在所有try--catch结构的最后,相当于其它。如果把它作为第一个catch 子句,则其后的catch字句均不起作用。
(7)try—catch结构可以与throw出现在同一个函数中,也可以不出现在同一个函数中,若本函数无catch,则转到上一级处理。
异常借口声明:
可以在函数的声明中列出这个函数可能抛掷的所有异常类型。
例如:void fun() throw(A,B,C,D);
若无异常接口声明,则此函数可以抛掷任何类型的异常。
不抛掷任何类型异常的函数声明如下:
void fun() throw();