異なるエンコーディング (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
...
}
これは私には理想的ではないようです。
おそらく最善の方法は、両方のオーバーロードを提供することです (スローしないオーバーロードで変換コードを実装し、スローするオーバーロードではスローしないバージョンを呼び出し、エラーの場合は戻りコードが例外をスローします)?