C++算法学习——预备知识(5)——异常处理(2)

C ++标准库提供了一个专门用于声明要抛出的对象作为异常的基类。它被称为exception,并在命名空间std下的< exception>头文件中定义。这个类有通常的默认和复制构造函数,运算符和析构函数,以及一个额外的虚拟成员函数,称为返回一个空值终止的字符序列(char *),并且可以在派生类中覆盖,以包含某种描述.

// standard exceptions
#include <iostream>
#include <exception>
using namespace std;

class myexception: public exception
{
  virtual const char* what() const throw()
  {
    return "My exception happened";
  }
} myex;

int main () {
  try
  {
    throw myex;
  }
  catch (exception& e)
  {
    cout << e.what() << endl;
  }
  return 0;
}

我们已经放置了一个通过引用捕获异常对象的处理程序(注意和符号和类型之后),因此它也捕获从异常派生的类,就像myexex的myex对象一样。
在这里,what() 是异常类提供的一个公共方法,它已被所有子异常类重载。这将返回异常产生的原因
C ++标准库的组件抛出的所有异常都会抛出从此std :: exception类派生的异常。这些是:

异常描述
std::bad_alloc该异常可以通过 new 抛出。
std::exception该异常是所有标准 C++ 异常的父类。
std::bad_typeid该异常可以通过 typeid 抛出。
ios_base::failure该异常可以通过 iostream的库函数抛出

例如,如果我们使用操作符 new并且不能分配内存,则抛出类型为bad_alloc的异常:

try
{
  int * myarray= new int[1000];
}
catch (bad_alloc&)
{
  cout << "Error allocating memory." << endl;
}

建议将所有动态内存分配包含在一个try块中,捕获这种类型的异常以执行一个干净的动作,而不是异常的程序终止,这是当这种类型的异常被抛出并没有被捕获时会发生什么。 如果你想强制执行一个bad_alloc异常来查看它的行为,你可以尝试分配一个巨大的数组; 在我的系统上,试图分配10亿个int,抛出一个bad_alloc异常。

因为bad_alloc是从标准基类异常导出的,所以我们可以通过捕获对异常类的引用来处理同一个异常:

// bad_alloc standard exception
#include <iostream>
#include <exception>
using namespace std;

int main () {
  try
  {
    int* myarray= new int[1000];
  }
  catch (exception& e)
  {
    cout << "Standard exception: " << e.what() << endl;
  }
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值