フェルマータ

個人用のメモ。ソフトウェアの導入とかが多くなる予定。

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);
  }
  ...
}

面倒くさいけどまあ伝統的な形式よりは…

 一応テストも書いたし動く模様だ。でもあんまり効率的じゃなくて重そうだな、とは思った。 あと、例外投げるところでメモリリーク発生してるよねこれ。まあいっか。