C++异常处理基础

写在前面:本文章来自于在学习过程中的总结,供大家参考。因水平有限,博客中难免会有不足,恳请大佬们不吝赐教!

相关文章:
[C++系列]小白的C++入门教程
C++标准程序库异常处理


在我们平时写程序时,一般都是先假定不会出现异乎寻常或不正确的结果。可是有的时候,用户不一定按照我们指定的方式使用,当出现错误的时候,难道程序直接崩溃吗?用户肯定不喜欢这样的程序。

C++的异常处理机制就解决了这个问题。异常最重要的用途就是处理可能会遇到特殊情况的函数。

在C++中,异常处理的过程时:某个库软件或你的代码提供了一种机制,能在出现异常情况的地方发出信号。这称为抛出异常。在程序的另一个地方,需添加合适的代码处理异常情况。这称为处理异常

异常处理的简单例子:

#include <iostream>
using namespace std;
int main()
{
	int x, y;	//x为分母,y为分子
	double result;
	try
	{
		cout << "Please input x:";
		cin >> x;
		cout << "Please input y:";
		cin >> y;
		if (x == 0)
		{
			throw x;
		}
		result = (double)y / (double)x;
		cout << "result = " << result << endl;
	}
	catch (int e)
	{
		cout << "异常处理:分母x为" << e << endl;
	}
	return 0;
}

一、try语句

try
{
	Code_To_Try	//	要尝试的代码
	Possibly_throw_An_Exception	//	可能抛出异常
	More_Code	//更多的代码
}

二、throw语句

语法
throw Expression_for_Value_to_Be_Throw;
示例
if(x==0)
	throw x;

有时候抛出的值直接就称为异常,所以执行throw语句就称为抛出异常

正如throw这个名称所暗示的,某样东西被“抛出”后,或从一个地方转移到另一个地方。在C++中,从一个地方转移到另一个地方的时“控制权”(以及抛出的值)。抛出异常后,throw语句所在的try块会停止执行,并开始执行catch块的代码。执行catch块的过程被称为捕捉异常处理异常

三、catch语句

catch (int e)
{
	cout << "异常处理:分母x为" << e << endl;
}

通常的,把catch块称为异常处理程序

catch块参数是catch块头部中的标识符,是可能抛出的异常(一个值)的占位符。一旦前面的try块抛出一个合适的值,该值就会传给catch的参数。catch参数课为任何合法(非保留字)标识符。

四、定义自己的异常类

我们一个自己的异常类,它的对象专门容纳抛出给catch块的信息。
实例:

#include <iostream>
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()
{
	Demo d;
	cout << "throw Exception in func()" << endl;
	throw MyException("exception throw by func()");
}
int main()
{
	try
	{
		func();
	}
	catch (MyException &e)
	{
		cout << "Caught an exception:" << e.getMessage() << endl;
	}
	
	return 0;
}

输出:
Constructor of Demo
throw Exception in func()
Destructor of Demo
Caught an exception:exception throw by func()

如实例所示,在try中抛出异常时会自动析构一些已有的类(例中的Demo d)。


由于水平有限,博客难免会有不足,恳请大佬们不吝赐教!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值