ループ脱出に例外を使うのはgoto乱用以上に良くないのでは?

gotoの話とは直接関係ないのだが…気になったのでメモ
http://blog.livedoor.jp/dankogai/archives/50707799.html

例外処理がある言語であれば、そちらを使う手もある。以下はJavaScriptの例。

try{
  for (var y = 0; y < height; y++){
    for (var x = 0; x < width; x++){
      img.setpixel(x, y, pix[offset++]);
      if (offset == pix.length) throw 'done';
    }
  }
}catch(e){}

JavaScriptはラベル付きループをサポートしており本来こういう書き方は不要。小飼さんは、ループ脱出のフロー制御例として挙げているだけということは分かるが、仮にラベル付きループが無くてもこういう例外の使い方は良くないのではないだろうか。例外は例外的状況からの回復にのみ使うべきであって、正常処理におけるフロー制御に使用すべきではないと考える。少なくともJava言語では、Joshua Blochが著書Effective Javaで述べているように、やってはいけない方法とされている。Javaに限らず問題と言えるのはループ内の別の箇所で例外がスローされた場合、これを握りつぶし、正常なループ終了と区別できなくなる可能性がある事だ。
例外を使うぐらいなら多重ループ部分をサブルーチンにして、returnすればいいと思う。これも無理のある例だがJavaScriptは無名関数でこんなことも出来る。

(function(){
  for (var y = 0; y < height; y++){
    for (var x = 0; x < width; x++){
      img.setpixel(x, y, pix[offset++]);
      if (offset == pix.length) return;
    }
  }
})();

Effective Java プログラミング言語ガイド

Effective Java プログラミング言語ガイド

  • 作者: Joshua Bloch,ジョシュア・ブロック,柴田芳樹
  • 出版社/メーカー: ピアソン・エデュケーション
  • 発売日: 2001/12/03
  • メディア: 単行本
  • 購入: 4人 クリック: 117回
  • この商品を含むブログ (105件) を見る

追記

と思ったんですが、JavaScriptの場合は例外でbreak代わりにするのもアリらしいですね。