17.C++异常处理

常用异常处理关键字

异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try、catch、throw。

  • throw:出现问题,抛出异常。
  • catch捕获异常。放在要处理问题的地方
  • try: 放入要保护的代码块,后面通常接多个catch块。

我们通常使用try …catch关键字来处理异常。
其中:try放置可能抛出异常的代码。称为保护代码。
实例:

try
{
   // 保护代码
}catch( ExceptionName e1 )
{
   // catch 块
}catch( ExceptionName e2 )
{
   // catch 块
}catch( ExceptionName eN )
{
   // catch 块
}

抛出异常

可以使用throw关键字在任意地方抛出异常。且可以操作任意表达式。表达式的类型决定了抛出异常的类型。
假设我们要做一个除法函数,显然0不能作分母。我们尝试抛出异常:

double division(int a,int b)
{
	if(b==0)
	{
		throw "division by 0 condition!";
	}
	return (a/b);
	
}

捕获异常

您可以指定想要捕捉的异常类型,这是由 catch 关键字后的括号内的异常声明决定的
如我们上面例子中:

try
{
   // 保护代码
}catch( ExceptionName e )
{
  // 处理 ExceptionName 异常的代码
}

代码会捕获一个类型为ExceptionName的异常。
如果你需要捕获任意类型的异常。括号里可以用省略号

try{
}catch(...)
{}

下面是一个实例,抛出一个除以零的异常,并在 catch 块中捕获该异常。我们把上面除0异常用throw的函数拿过来。写一个main函数:
注意这里用了cerr对象,常用输出到标准错误,他是一个ofstream对象

#include <iostream>
using namespace std;
int division(int a, int b)
{
   if( b == 0 )
   {
      throw "Division by zero condition!";
   }
   return (a/b);
}

int main()
{
	int x=50,y=0,z=0;
	try{
	z=division(x,y);
	cout<<z<<endl;
	}catch(const char& msg)
	{
		cerr<<msg<<endl;
	}
	

我们throw抛出的 "Division by zero condition!"是const char* 类型的异常,因此捕获时,必须在catch块中使用const char*。
执行时会产生以下结果:

Division by zero condition!

C++标准异常

C++ 提供了一系列标准的异常,定义在 中,我们可以在程序中使用这些标准的异常。它们是以父子类层次结构组织起来的,如下所示:
在这里插入图片描述
在这里插入图片描述

注意最后这里exception是C++标准异常,而what()是异常类提供的公共方法,被所有子异常类重载。将返回异常产生的原因。
所以我们可以统一这样写:
catch (exception const& why)
{ cerr<<“说明:”<<why.what()<<endl;}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值