我有以下功能(C++):處理不正確的參數值
string dataInYear(int year) {
if (year < 2000) {
//don't support retrieving data from before 2000
}
//return data for the year >= 2000
}
我應該在這裏,如果一年< 2000拋出異常?怎麼樣使用輸出錯誤字符串作爲paramater:
string dataInYear(int year, string &error) {
if (year < 2000) {
error = "don't support retrieving data from before 2000";
return "";
}
//return data for the year >= 2000
}
我不知道如何使用異常的原因是,來電者不只是從看的頭文件,這個功能可以拋出一個異常,知道(而不僅僅是返回一個空字符串)。通過第二個選項,調用者被迫通過傳入錯誤字符串並在之後檢查來確認方法可能失敗。
或者作爲第三個選擇:
template <class A> struct Failable
{
bool error;
A value;
wxString errorString;
Failable(wxString errorStr) : error(true), errorString(errorStr) {}
Failable(A val) : error(false), value(val) {}
operator A() const { return value; }
};
Failable<string> dataInYear(int year) {
if (year < 2000) {
error = "don't support retrieving data from before 2000";
return "";
}
//return data for the year >= 2000
}
//caller
Failable<string> d = dataInYear(y);
if (d.error) {
//deal with error
} else {
string data = d.value;
}
避免std :: string指針(大部分和你的用法都是錯誤的)。改爲使用參考。 –
boost :: optional將是一個很好的返回值(可能在C++ 17中可用) –
一個解決方案是使用*來記錄'dataInYear',除非年份<2000 *,否則調用此函數是UB。查看「按合同設計」瞭解更多詳情。有一百萬其他解決方案几乎找不到一個正確的解決方案,所以這個問題主要是基於意見的。 – nwp