簡體   English   中英

返回NaN還是拋出異常?

[英]Returning NaN or throwing an exception?

我有一個函數,它獲取一個樣本(一個std::vector<double> )作為輸入,並計算樣本的平均值:處理空輸入向量的最佳方法是什么?

我的第一個想法是在這個片段中拋出異常:

double average(const std::vector<double>& sample)
{
   size_t sz = sample.size();
   if (sz==0) throw std::exception("unexpected empty vector");

   double acc = 0;
   for (size_t i=0; i<sz; ++i) acc += sample[i];
   return acc/sz;
}

但我認為另一種解決方案可能是返回NaN:

double average(const std::vector<double>& sample)
{
   size_t sz = sample.size();
   if (sz==0) return std::numeric_limits<double>::quiet_NaN();

   double acc = 0;
   for (size_t i=0; i<sz; ++i) acc += sample[i];
   return acc/sz;
}

我喜歡這個例外,因為它顯示了問題發生的地方,而如果我在長時間計算的最終結果中得到一個NaN,那么我將更難理解NaN誕生的地方。 無論如何,對於NaN,我喜歡返回“特殊”雙重信號的可能性,以表示意外發生的事情。

有沒有其他方法來處理空向量? 謝謝。

我認為在數學上NaN會更正確。 最后它是0.0/0 如果它是一個直接的分裂,會發生什么?

請注意,關於C ++和例外,存在神聖的戰爭。 例如讀這個: 拋出或不拋出異常?

我會把行為定義為未定義。

只需為非空案例編寫代碼,讓調用者考慮正確使用它。 可能你不會為空向量調用它,因為空輸入的檢查可能會提前完成。

您對使用異常的理解是正確的,您應該繼續使用該方法。 例外都是為了這個目的( throw在例外情況發生)。

在這種情況下,假設你返回NaN ,那么每當你調用函數average()你必須確保,你正在進行額外的檢查來處理NaN場景。

[注意:最重要的是,確保條件(sz == 0)不是經常發生的情況。 IMO,如果經常被拋出,我不會使用例外。]

我會拋出,只是為了保持安全,並確保立即檢測到錯誤,而不是如你所說,過了一會兒。

實際上在這個特定的用例中你可以返回0,如果有意義的話說0是“無”的平均值。

我們通常做的是在我們進入方法后立即驗證參數,如果我們拋出ArgumentNullException或OutOfRangeException,如果該方法實際上只是用非null和正確填充的參數調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM