Item 8:異常逃避解析関数【effective C++読書ノート】

1066 ワード

解析関数に異常を表示させないでください.解析関数で呼び出された関数による異常であれば、解析関数で異常を処理(try,catch)、異常(伝播しない)または終了プログラムを飲み込む必要があります.例ではclose()は呼び出しが必要な関数です.
                                            
①プログラムが「解析中に発生したエラー」に遭遇した後も実行を続行できない場合、「強制終了プログラム」は合理的なオプションであり、結局、例外が解析関数から伝播することを阻止することができる.例外を投げ出して終了する場合は、通常abortを呼び出すことで完了します.
A::~A()
{
        try{
	   close();
        }
        catch(…){
	//      
	   std::abort();
        }
}

②異常を飲み込むのは一般的に悪い考えですが、軽率にプログラムを終了したり、不明確な行為を招くよりも良い場合があります.例外を飲み込むには:
A::~A()
{
	try{
           close();
        }
        catch(…){
	//      
        }
}

3以上の2つの方法はいずれも発生する可能性のある問題を処理することができないため、最適な戦略はインタフェースを再設計し、ユーザーがプログラムの実行中に投げ出した異常を自分で処理することができ、ユーザーが処理していないときに構造関数の関数を呼び出すことである.クラスには、通常の関数(非構造関数)が用意されています.
class A{
public:
	void func()
	{
		close();
		closed=true;
	}
        ~A()
        {
	     if(!closed)
	    {
	        try{
		  close();
	        }
	        catch(…){
	        //      
	        }
           }
       }
private:
	bool closed;
}