2016-04-21 52 views
3

我只是有一個困境,當函數可能失敗時,我應該如何從函數返回智能指針。我可以挑選以下選項之一:最佳實踐 - 從函數返回指針

  1. 返回指針,並拋出異常,如果函數失敗:
 

    std::shared_ptr foo() { 
     // ... 
     if (!ok) 
      throw; 
     return ptr; 
    } 

  • 返回指針,並返回空指針如果函數失敗
  •  
    
        std::shared_ptr foo() { 
         // ... 
         if (!ok) 
          return std::shared_ptr(); 
    
         return ptr; 
        } 
    
    
    通過引用
  • 通行證指針,和返回布爾標誌
  •  
    
        bool foo(std::shared_ptr& ptr) { 
         // ... 
         if (ok) 
          ptr = ...; 
    
         return ok; 
        } 
    
    

    是否有任何的最佳實踐,指導方針,如何報告,該函數沒有正確執行呢?或者它通常是項目特定的?

    感謝您的回答

    +1

    Ve ry相關:[檢索方法是否應該返回'null'或拋出異常時,它不能產生返回值?](http://stackoverflow.com/q/175532/3425536) – emlai

    +1

    任何答案將是高度意見爲主。但是,無論是否有人同意你的決定**只要確保行爲記錄**。 –

    +2

    不要使用#3,#1更好;它不會讓調用者忘記處理錯誤。 #2是好的,因爲調用者必須檢查null。像往常一樣,這些都不是硬性規則,因爲有時你的環境會施加額外的限制(例外太慢/不存在等) – GManNickG

    回答

    -1

    好問題。我認爲這取決於錯誤的發生或性質。 如果你預見到這個錯誤發生在半偶然的情況下,或者它是一個預期的錯誤,或者它是一個可以以某種方式恢復的錯誤,那麼我會使用方法2或3.

    但是,如果錯誤是不應該的,通常會發生,它會導致應用程序無法正常工作我會使用第一種方法。

    我的推理是,與其他兩種方法相比,異常情況可能會變得更慢(請參閱Are Exceptions in C++ really slow,本質上,異常會流向主調用方,因此您希望重要錯誤向上移動並停止過程

    +4

    _「與其他兩種方法相比,異常速度較慢」_證明了這一點。 –

    +0

    也許我應該說,它通常較慢,但並非總是如此。 – ArmenB

    1

    老實說,正確的答案取決於被調用函數的作用,以及失敗的後果是什麼。對於庫,我建議要麼拋出一個異常,要麼返回一個表示失敗的值。並且返回一個標誌似乎有問題,除非您經常使用該習語,或者如果有理由在外部管理該共享指針。