2016-04-03 12 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指針,你應該在初始化過程中保釋出來,而不是在未知的時間。 – mustaccio

+0

@mustaccio如果我在構造函數中檢查了'NULL指針',我將不得不稍後檢查它(例如在write_data中)? –

回答

0

一個古老的困境。

這難道不是真的歸結爲你的班級設計嗎,合同與消費者是什麼?

如果write_data()永遠不會寫入,那麼除了我會考慮從構造函數中拋出異常外,還會有一個異常。我總是喜歡快速失敗,所以只要你知道指針是無效的,因爲write_data永遠不會工作,然後把它扔到那裏。有些人不同意從構造函數拋出異常,因爲它可以留下部分實例化的類,但似乎很小。在實際的{}中檢查null並拋出任何合適的東西(在Java中,你可能會拋出一個InvalidArgumentException)。

如果不能保證write_data()實際上會被調用,並且因此在第一次調用該方法時拋出它,那麼您基本上可以執行延遲初始化。

如果合同不能保證任何內容寫入緩衝區,並且空指針因此是有效的,那麼只需記錄一條消息並繼續。

[其實我登錄的東西不分,使得調試更加簡單,雖然日誌級別可能受到嚴重/致命警告與/ INFO]

相關問題