第17章 用于大型程序的工具(4)
17.1.7 异常类层次
exception类型所定义的唯一操作是一个名为what的虚成员,该函数返回const char*对象,它一般返回用来在抛出位置构造异常对象的信息。因为what是虚函数,如果捕获了基类类型引用,对what函数的调用将执行适合异常对象的动态类型的版本。
1. 用于书店应用程序的异常类
应用程序还应该经常通过从exception类或者中间基类派生附加类型来扩充exception层次。这些新派生的类可以表示特定于应用程序领域的异常类型。
#ifndef BOOKEXCEPTION_H
#define BOOKEXCEPTION_H
#include <iostream>
#include <string>
using namespace std;
class out_of_stock:public runtime_error{
public:
explicit out_of_stock(const string &message):runtime_error(message){}
};
class isbn_mismatch:public logic_error{
public:
explicit isbn_mismatch(const string &message):logic_error(message){}
isbn_mismatch(const string &message, const string &lhs, const string &rhs)
:logic_error(message),left(lhs),right(rhs){}
const string left,right;
virtual ~isbn_mismatch() throw(){}
};
#endif
#ifndef BOOKEXCEPTION_H
#define BOOKEXCEPTION_H
#include <iostream>
#include <string>
using namespace std;
class out_of_stock:public runtime_error{
public:
explicit out_of_stock(const string &message):runtime_error(message){}
};
class isbn_mismatch:public logic_error{
public:
explicit isbn_mismatch(const string &message):logic_error(message){}
isbn_mismatch(const string &message, const string &lhs, const string &rhs)
:logic_error(message),left(lhs),right(rhs){}
const string left,right;
virtual ~isbn_mismatch() throw(){}
};
#endif2. 使用程序员定义的异常类型
try{
throw out_of_stock("Here is the exception of out_of_stock...");
}
catch(out_of_stock e){
cout<<e.what()<<endl;
}
try{
throw out_of_stock("Here is the exception of out_of_stock...");
}
catch(out_of_stock e){
cout<<e.what()<<endl;
}17.1.8 自动资源释放
对析构函数的运行导致一个重要的编程技术的出现,它使程序更为异常安全的(exception safe)。异常安全意味着,即使发生异常,程序也能正常操作。在这种情况下,“安全”来自于保证“如果发生异常,被分配的任何资源都适当地释放”。
通过定义一个类来封装资源的分配和释放,可以保证正确释放资源。这一技术常称为“资源分配即初始化”,简称RAII。
可能存在异常的程序以及分配资源的程序应该使用类来管理那些资源。如本节所述,使用类管理分配和回收可以保证如果发生异常就释放资源。
摘自 xufei96的专栏
补充:软件开发 , C++ ,