在編寫不同編碼的字符串(例如從UTF-8到UTF-16)之間進行轉換的函數時,處理錯誤的最佳方式是什麼(例如無效的輸入UTF-8字節序列)?拋出異常或返回錯誤代碼(甚至是bool
)?字符串轉換錯誤:異常或錯誤代碼?
// Throws a C++ exception on error.
std::wstring ConvertFromUtf8ToUtf16(const std::string& utf8);
// Returns true on success, false on error.
bool ConvertFromUtf8ToUtf16(std::wstring& utf16, const std::string& utf8);
使用異常,可能會進行鏈接函數調用(當函數返回值用作其他函數/方法的輸入時)。
但我不確定在這種情況下使用異常是好的;我在想Eric Lippert in his quality blog post叫什麼難以忍受的例外(和相關的Int32.Parse()/TryParse()
例子)。
例如,如果使用異常,調用者要用力包裹在try/catch
塊函數調用來檢查無效的UTF-8輸入的情況下:
try
{
wstring utf16 = ConvertFromUtf8ToUtf16(utf8);
}
catch(const Utf8ConversionException& e)
{
// Bad UTF-8 byte sequence
...
}
這似乎並不理想給我。
也許做的最好的事情是隻提供都重載(實現在不拋出過載轉換代碼,並在投擲超載只是調用不拋出版本,並在錯誤返回碼的情況下拋出異常)?
從utf-8到utf-16的轉換可能發生什麼錯誤? (提示:驗證輸入應與轉換完全分開) –
如果轉換爲UTF-16,結果應該是'std :: u16string',而不是'std :: wstring'。後者有[非常具體的目的](http://stackoverflow.com/questions/6300804/wchars-encodings-standards-and-portability)。 –
假設從UTF-8轉換在實踐中幾乎總是成功的,使用異常處理錯誤並不是不合理的。 – Jon