[英]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.