在编写一个函数来在不同编码的字符串之间进行转换(例如从 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在他的质量博客文章中所说的令人烦恼的异常(以及相关Int32.Parse()/TryParse()
示例)。
例如,如果使用异常,则应强制调用者将函数调用包装在try/catch
块中以检查无效 UTF-8 输入的大小写:
try
{
wstring utf16 = ConvertFromUtf8ToUtf16(utf8);
}
catch(const Utf8ConversionException& e)
{
// Bad UTF-8 byte sequence
...
}
这对我来说似乎并不理想。
也许最好的办法是只提供两个重载(在非抛出重载中实现转换代码,在抛出重载中只调用非抛出版本,并在错误返回代码的情况下抛出异常)?