异常处理:
- 需要异常处理机制的主要思想:
函数A在执行一系列操作时出现了异常,此时可以先不进行处理,然后将其抛出到B函数中去,以此类推…… - 基本语法:
a) throw 表达式;
该语句抛出一个异常,异常是一个表达式,其值的类型可以是基本类型也可以是类。
b) try……catch语句:
try{
语句组;
}catch(异常 e){
异常处理方法;
}
……
catch(异常e){
异常处理方法;
}
注意:catch可以有多个,但是!!!try必须有一个!!!
try……catch的理解:
a) 执行try中的语句组,如果没有异常发生,则后面所有的catch块中的函数都不会处理。
b) 如果try中抛出异常,抛出异常后立即跳转到第一个与抛出异常类型相匹配的catch块中执行(即:捕获),执行完成后跳出catch执行。
示例:
#include <iostream>
using namespace std;
int main()
{
double m ,n;
cin >> m >> n;
try {
if( n == 0)
throw -1; //抛出int类型异常
else
cout << m / n << endl;
}
catch(double d) {
cout << "catch(double) " << d << endl;
}
catch(int e) {
cout << "catch(int) " << e << endl;
}
cout << "程序结束" << endl;
system("pause");
return 0;
}
-
能够捕获所有异常的catch语句:
catch(……){
}示例:
#include <iostream>
using namespace std;
int main()
{
double m, n;
cin >> m >> n;
try {
if (n == 0)
throw - 1; //抛出整型异常
else if (m == 0)
throw - 1.0; //拋出 double 型异常
else
cout << m / n << endl;
}
catch (double d) {
cout << "catch (double)" << d << endl;
}
catch (...) {
cout << "catch (...)" << endl;
}
cout << "结束程序" << endl;
system("pause");
return 0;
}
注意:catch(……){}一定要写在所有catch的最后面!
当输入m=0,n=1时会发现,如图下所示:
因为catch(double d){}首先捕捉到了异常,所以先执行,执行完成后跳出catch块,后面的catch块就不起任何作用。
5. 再抛出:
如果一个函数在执行过程中拋出的异常在本函数内就被 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("y为0");
cout << "in Devide" << endl;
return x / y;
}
int CountTax(int salary)
{
try {
if (salary < 0)
throw - 1;
cout << "这里并不能输出一句话!!" << endl;
}
catch (int) {
cout << "捕获异常-1" << endl;
}
cout << "这里可以输出一句话!" << endl;
return salary * 0.15;
}
int main()
{
double f = 1.9;
try {
CountTax(-1);
f = Devide(3, 0);
cout << "end of try block" << endl;
}
catch (CException e) {
cout << e.msg << endl;
}
cout << "f = " << f << endl;
cout << "程序结束" << endl;
system("pause");
return 0;
}