C++ でエラー処理書いてたら死にそうになったので Scala の Try パクってみた。
ポエム
業務で Scala を書いてるせいか、趣味で C++ 書いていると C++ のエラー処理のヤバさにつらみが溜まるし発狂したい。こういうのほんとうに辛い。
/** * path のファイルに書かれた文字列を返します。 * エラーがあった場合は err に値が書き込まれます。 */ string load(const string &path, int *err);
異常系の処理が貧弱すぎてつらい。何が嫌かって、きっとこの後ファイルの内容をパーズするわけで、 こんな感じの関数が作られるに違いない。
/** * str を json に変換します。 * エラーがあった場合は err に値が書き込まれます。 */ json parse(const string &str, int *err);
実際に使われるのはきっとこんな感じになるに違いない。
void main() { int err; string str(load("hoge.txt", &err)); if(err != 0) { printf("File load error!!\n"); exit(-1); } json j(parse(str, &err)); switch(err) { case ... } }
もうこんなの絶対発狂したい。でも例外使って try catch のハンドリングも面倒くさい。
Scala の Try パクった
上の例だとこんな感じになる。
Try<string> load(const string &path); Try<json> parse(const string &str); void main() { Try<json> result(load("hoge.txt").flatMap([](const string&str) -> Try<json>{ return parse(str); })); if(result.isFailure()) { exit(-1); } ... }
面倒くさいけどまあ伝統的な形式よりは…
一応テストも書いたし動く模様だ。でもあんまり効率的じゃなくて重そうだな、とは思った。 あと、例外投げるところでメモリリーク発生してるよねこれ。まあいっか。