福間@福岡 です。

記事 <000901bf2f6f$48f9d0b0$0201a8c0 / tinyforest.gr.jp> にて、
"Shigeo Kobayashi" <shigeo / tinyforest.gr.jp> さんは書きました:

> 「例外」という言葉を、安易に使ってしまいました。C++でも、障害復旧
> 目的以外に(大域脱出のために)、try/throw/catchをよく使うので、
> その点では同じだと判断しました。ただ、C++ではthrowしないと
> catchは実行されないのでちょっと気になった次第です。

Rubyの catch/throw は、C++の try+catch/throw というよりは、むしろCの
setjmp()/longjmp() に似ています。

  jmp_buf tag;
  
  int
  foo1(void)
  {
      longjmp(tag, 25);
      return -1;
  }

  int
  foo2(void)
  {
      return foo1();
  }
  
  int
  main(int argc, char *argv[])
  {
      int result;
  
      if ((result = setjmp(tag)) == 0) {
          result = foo2();  /* foo2() → foo1() → longjmp() で
                               setjmp() までジャンプ */
      }
      /* ここから実行を再開、result の値は 25 */
      
      return 0;
  }

> >   x = catch(:hoge){ throw(:hoge) unless num > 0; num }

> ーん。もし、num>0ならthrowは実行されないので、ブロックの
> 最後の値になるということですね。throwしないのに、こぼれた
> numの値を「catch」するってことになる...(しつこくてすいません)

catchするのは「引数で指定されたタグ(:hoge)」であって、値ではありません。
対応するタグがthrowされなかったら、catchは何もcatchせずに終了します。

---
 Yasuhiro Fukuma (福間 康弘) as Yasu.F @ Kitakyushu.Fukuoka.Japan
 Web site: http://www8.big.or.jp/~yasuf/
 PGP fingerprint = 17 25 8A F3 99 E5 7E 19  C0 EA 6E 03 8A C3 CE F0
 “I hate AMERIKA-JIN.”