【发布时间】:2012-09-15 15:28:58
【问题描述】:
在编写一个函数以在不同编码的字符串之间进行转换(例如从 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
...
}
这对我来说似乎并不理想。
也许最好的办法是只提供 both 重载(在非抛出重载中实现转换代码,而在抛出重载中只需调用非抛出版本,以防万一的错误返回码抛出异常)?
【问题讨论】:
-
从 utf-8 到 utf-16 的转换会出现哪些错误? (提示:验证输入应该与转换完全分开)
-
如果转换为 UTF-16,结果应该是
std::u16string,而不是std::wstring。后者有一个very specific purpose。 -
假设从 UTF-8 转换在实践中几乎总能成功,使用异常处理错误并非不合理。
标签: c++ exception exception-handling