2016-04-03 4 views
1

次のように私はクラスを持っている:例外をスローするか、エラーコードを返すか、いくつかのログを出力してabort()を呼び出す必要がありますか?

class MyBuffer 
{ 
    private: 
     char* ptr_; 
    public: 
     MyBuffer(char* ptr_tmp) : ptr_(ptr_tmp) {}; 
     void write_data(int val) 
     { 
      if(ptr_ == NULL) 
      { 
       // What should I do here? 
       // throw an exception, return error code, or just abort()? 
      } 

      // Write val to the buffer pointed by ptr_ 
      // ... 
     } 
}; 

ptr_は、初期化後に変更することはできません。これは、開発者がコンストラクタでNULLポインタを渡す場合に限り、ptr_ == NULLという文がtrueになることを意味します。これが発生した場合、例外をスローするか、エラーコードを返すかのいずれかで、処理コードはプログラムをすぐに終了する必要があります。

私は例外とエラーについていくつかの議論を読みました。例外は「予測的」だが「例外的」な場合に使うべきだと私は思う。私の例では、ptr_ == NULLが真の場合、例外ではなくバグでしょうか?

+0

間違いなくNULLポインタを渡された場合、あなたは初期化時に救済すべきである[私は実際にログレベルがWARNING/INFO対FATAL/SEVEREかもしれませんが、より簡単にデバッグ。になり、関係なく、何かをログに記録したいです]後で不明ではない。 – mustaccio

+0

@mustaccioコンストラクタで 'NULL pointer'をチェックした場合、後で確認する必要があります(write_dataなど)? –

答えて

0

年齢のジレンマ。

本当にあなたのクラスデザインには出てこないのですが、契約は消費者と何ですか?

write_data()が書き込みをしてはならない場合は、コンストラクタからスローすることを除いて、例外が順番に並んでいます。私はいつも速く失敗したいので、write_dataは決して動かないのでポインタが無効であることを知ったら直ちにそれを投げてください。部分的にインスタンス化されたクラスを残すことができるので、コンストラクタから例外をスローすることに同意しない人もいますが、それは軽微です。実際の{}ではnullをチェックし、適切なものを投げる(Javaでは、InvalidArgumentExceptionをスローする可能性が高い)。

write_data()が実際に呼び出される保証がない場合は、基本的に遅延初期化を行うことができます。したがって、メソッドが初めて呼び出されたときにスローします。

契約書でバッファに書き込まれたものが保証されず、したがってNULLポインタが有効な場合は、メッセージを記録して移動してください。

関連する問題