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的專欄