关于异常处理

异常处理:

  1. 需要异常处理机制的主要思想:
    函数A在执行一系列操作时出现了异常,此时可以先不进行处理,然后将其抛出到B函数中去,以此类推……
  2. 基本语法:
    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;
}
  1. 能够捕获所有异常的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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值