From: matz@... (Yukihiro Matsumoto) Date: 2003-11-02T00:43:02+09:00 Subject: [ruby-dev:21814] Re: few seconds wait to exit when exception is raised in inspect まつもと ゆきひろです In message "[ruby-dev:21813] few seconds wait to exit when exception is raised in inspect" on 03/11/02, Tanaka Akira writes: |% time bin/ruby -ve ' |class C | def inspect | x | end |end |C.new.inspect' |ruby 1.8.1 (2003-11-01) [i686-linux] |-e:4:in `inspect': undefined local variable or method `x' for # (NameError) | from -e:7 |bin/ruby -ve ' class C def inspect x end end C.new.inspect' 1.97s user 0.06s system 100% cpu 2.024 total | |というように、inspect の中でエラーが出ると、終了するまでに何秒かかかる |のですが、これはなんか変じゃないでしょうか。 変と言えば変ですが、例外が発生して例外オブジェクトを作るとき にinspectを呼ぶので、inspectにエラーがあると次々と例外処理が 再帰的に呼ばれ、ついにスタックを使いきった時点で再帰が巻き戻 るという現象が起きてます。-dオプションを付けるとその様子が目 に見えます。 これを避けるのはけっこう難しいかも。あー、NameErrorに関して はメッセージ生成を遅延する手が使えるかなあ。